这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战。
存在重复元素
题目
给你一个整数数组 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
方法一
思路:
循环数组放到一个对象中,将数组元素作为对象的 key,将 下标+1 作为对象的 value,判断对象是否存在对应数组元素的 key 值,若存在,则返回 true 。若不存在则将数组的元素放入对象中。
代码:
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
const obj = {}
for(let i=0;i<nums.length;i++) {
if(obj[nums[i]]) {
return true
} else {
obj[nums[i]] = i+1
}
}
return false
};
结果:
- 执行结果: 通过
- 执行用时:84 ms, 在所有 JavaScript 提交中击败了69.72%的用户
- 内存消耗:50.1 MB, 在所有 JavaScript 提交中击败了5.05%的用户
- 通过测试用例:69 / 69
方法二
思路:
- 将数组使用
Set去重,判断去重后数组的长度是否小于原数组的长度。 代码:
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
const noDupArr = Array.from(new Set(nums))
return nums.length > noDupArr.length
};
结果:
- 执行结果: 通过
- 执行用时:88 ms, 在所有 JavaScript 提交中击败了61.02%的用户
- 内存消耗:49.9 MB, 在所有 JavaScript 提交中击败了5.05%的用户
- 通过测试用例:69 / 69
最大子数组和
题目
给你一个整数数组 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
解题方法
思路:
关键点在于判断加上 nums[i] 后比 nums[i] 小,那么就说明 i之前的和比i的数值小,就可以把前面的都舍掉,重新计算和。
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
if(nums.length === 1) return nums[0]
let maxSum = nums[0]
let currentSum = nums[0]
for(let i=1;i<nums.length;i++) {
currentSum += nums[i]
if(currentSum < nums[i]) {
currentSum = nums[i]
}
if(currentSum > maxSum) {
maxSum = currentSum
}
}
return maxSum
};
结果:
- 执行结果: 通过
- 执行用时:88 ms, 在所有 JavaScript 提交中击败了82.61%的用户
- 内存消耗:49.1 MB, 在所有 JavaScript 提交中击败了25.91%的用户
- 通过测试用例:209 / 209