LeetCode 数据结构入门 day 1 - 数组

119 阅读2分钟

这是我参与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

— END