前言
携手创作,共同成长!这是我参与「掘金日新计划 · 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
};
- 但是这种消耗的时间就太长了,而且看起来就不那么的优雅。
- 那么这种类似查重计数一类的题,可以创建一个新的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
};
- 这种时间消耗大大较少,其实
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
}
总结
以上就是数据结构入门级算法题第一天的两道题,有不正确的地方看到的大佬可以在评论区指出,谢谢!