1. 简单的两数之和,从入门到放弃

51 阅读1分钟

万事开头难,然后中间难,最后结尾难 今天3.29,打开leetcode 我们的目标是leetcode之王!

1.题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum

2.思路

简单的第一道题,两个数相加等于目标数就行了,且索引不相等,

2.1嵌套循环

ok,审题完毕,嵌套循环搞定 var twoSum = function(nums, target) {

   for(let i=0;i<nums.length-1;i++){
       for(let j =i+1;j<nums.length;j++){
           if(nums[i]+nums[j]==target){
               return [i,j]
           }
       }
   }
};

提交通过, image.png

沾沾自喜!

2.1 加入map

看一下别人的解题思路,?使用map? 用get和set方法? 似乎也可以,再来

var twoSum = function(nums, target) {
    
    let map = new Map()
    nums.forEach((item,index)=>{
        map.set(item,index)
    })
    nums.forEach((item,index)=>{
        if(map.has(target-item) &&i!=map.get(target-item)){
            return [i,map.get(target-item)]
        }
    })
};

2.2 forEach的坑

????,怎么一直返回undefined,待我细细查看,原来是forEach的问题 md forEach不能终端 return没有用

var twoSum = function(nums, target) {
    
    let map = new Map()
    nums.forEach((item,index)=>{
        map.set(item,index)
    })
    for(let i=0;i<nums.length;i++){
        if(map.has(target-nums[i]) &&i!=map.get(target-nums[i])){
            return [i,map.get(target-nums[i])]
        }
    }
};

2.3 搞定

修改一下 两个循环搞定

var twoSum = function(nums, target) {
    
    let map = new Map()
    nums.forEach((item,index)=>{
        map.set(item,index)
    })
    for(let i=0;i<nums.length;i++){
        if(map.has(target-nums[i]) &&i!=map.get(target-nums[i])){
            return [i,map.get(target-nums[i])]
        }
    }
};

错误是之前没有考虑索引不能相等 image.png

2.4 优化大法

是不是和大佬们解题一样啊,遂浏览答案,咦?它只用了一个循环?

var twoSum = function(nums, target) {
    let map=new Map()
    for(let i=0;i<nums.length;i++){
        if(map.has(target-nums[i])){
            return [i,map.get(target-nums[i])]
        }
        map.set(nums[i],i)
    }
};

啊,好难,不过搞定 cv大法

image.png