前端-数据结构入门级算法题第一天(存在重复元素(题号:217,简单)和 最大子数组和(题号:53,中等))

88 阅读1分钟

前言

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 >>

第一题:存在重复元素

  • 题目:给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
  • 示例1:
输入:[9,4,5,4,5]
输出:true
  • 示例2:
输入:[9,8,7,6,5]
输出:false

解题思路

  • 这道题比较笨的方法就是双重遍历,判断两次遍历的下标不相同的情况下,是否有相等的值,如果有则直接返回true,具体代码如下:
function containsDuplicate(nums: number[]): boolean {
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length; j++) {
            if (i !== j && nums[i] === nums[j]) {
                return true
            }
        }
    }
    return false
};
  • 但是这种消耗的时间就太长了,而且看起来就不那么的优雅。

时间.jpg

  • 那么这种类似查重计数一类的题,可以创建一个新的Map对象
function containsDuplicate(nums: number[]): boolean { 
    const map=new Map() 
    for(let i of nums){ 
        if(map.has(i)){ 
            return true 
        }else{ 
            map.set(i,1) 
        } 
    } 
    return false 
 };

块.jpg

  • 这种时间消耗大大较少,其实 Map是一组键值对的结构,具有极快的查找速度。我们首先遍历数组,然后通过Map的has()方法,判断新创建的map里是否存在键值,存在则返回 true,没有则将设置值为 Map 对象中的键值。

第二题:最大子数组和

  • 题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
  • 示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组[4,-1,2,1]的和最大,为6
  • 示例2:
输入: nums = [5]
输出: 5

解题思路

  • 贪心算法: 从局部最优解中推出全局最优解
    • 如果当前位置前面的最大子数组和sum小于0,说明前面的最大子数组和对当前位置是副作用,直接将当前位置的值作为本身位置的最大子数组和。
    • 记录每一个位置的最大子数组和,并取最大的子数组和。max是用于记录每个位置上的最大子数组和,取其中的最大值,起始值为数组的第一个元素。
  • 具体代码如下:
function maxSubArray(nums: number[]): number {
    let sum = 0  // sum用于记录当前位置的最大子数组和
    let max = nums[0]  // ans是用于记录每个位置上的最大子数组和,取其中的最大值,起始值为数组的第一个元素
    for(let i = 0 ; i < nums.length ; i++) {
        // 如果当前位置前面的最大数组和sum大于0,则继续累加当前元素的值
        if(sum > 0) {
            sum += nums[i]
        }else {
            // 反之如果最大数组和sum小于0,说明前面的最大子数组和对当前位置是副作用,直接将当前位置作为本身位置的最大子数组和
            sum = nums[i]
        }
        // 最后通过Math.max()方法取其中最大值
        max = Math.max(max,sum)
    }
    return max
}

总结

以上就是数据结构入门级算法题第一天的两道题,有不正确的地方看到的大佬可以在评论区指出,谢谢!