LeetCode题解

数据结构入门

判断数组中是否有重复的元素

题目
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true
示例 2:

输入:nums = [1,2,3,4]
输出:false
示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

提示:

1 <= nums.length <= 105
-109 <= nums[i] <= 109

题解

  1. 目前最优解
    类数组对象一般具有length属性,Set对象比较特殊,它没有length属性,而是size属性
    var声明的变量没有块级作用域,在全局有效
    解题思路:Set对象可以看做是键和值相同的Map对象,所以它没有重复元素。先将数组转换成Set对象实现去重,若有重复元素,Set对象的元素个数会比原数组的元素个数少,据此判断数组中是否有重复元素
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
let set=new Set(nums)
if(set.size!==nums.length)
return true
return false
};

indexOf()从前往后查找数组元素,返回数组下标,没找到返回-1
lastIndexOf()与indexOf的区别是从后往前查找
若有重复元素,二者返回的下标必定不相等。所以可以通过比较返回下标判断数组是否有重复元素

/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
for(let i of nums){
if(nums.indexOf(i)!==nums.lastIndexOf(i))
return true
}
return false
};

最大子段和

题目
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:

输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104

  1. 贪心算法

时间复杂度:O(n)
空间复杂度:O(1)
C语言实现

int maxSubArray(int n,int *nums)
{
int i,sum=nums[0],b=0;
//b表示必须包含a[i]且只能从a[i]向左侧延伸的最大子段和
//b是当前最大值 ,每次循环b都会更新
for(i=0;i<=n;i++)
{
if(b>0)
b+=a[i];
else
b=a[i];
if(b>sum)
sum=b;//sum=max(b[i])
}
return sum;
}

JS实现

/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
// sum=nums[0]考虑了整个数组为负数或数组元素只有1个的情况
let b=0,sum=nums[0]
for(let a of nums){
if(b>0){
b+=a
}
else{
b=a
}
if(b>sum) sum=b
}
return sum
};
  1. 动态规划(目前最简洁)
    时间复杂度:O(n)
    空间复杂度:O(1)
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
//注意这里i<nums.length-1而不是i<nums.length,因为当i=nums.length-2时就已经求到了nums[nums.lenngth-1]。如果写成i<nums.length-1的话最后nums[nums.lenngth-1]的值为NAN
for(i=0;i<nums.length-1;i++){
if(nums[i]>0){
nums[i+1]+=nums[i]
}
else{
nums[i+1]=nums[i+1]
}
}
return Math.max(...nums)
};

本文作者:Code6E

本文链接:https://www.cnblogs.com/road2code/p/17157182.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Code6E  阅读(18)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.