前言,从今天开始每天都坚持刷一道力扣的题,一星期至少刷5道,简要整理下博客以督促自己。(等后面题难再对计划进行变更)–20.12.10
确定自己打算找开发岗,大概率也是Java开发,再重头用java刷题。–21.8.28
题目连接
解题思路(旧)
两层for循环,第一层,每次都假定当前值nums[i]就是其中的第一个加数,定义一个temp整型变量,用于存放target减去当前值剩余的值;第二层for循环,直接找余下中是等于temp的那个值
解题思路(更)
重新看了官网题解才知道还有【哈希表】这种方法,可见第一次是刷了个寂寞>_<
- 把数组中每个元素的【值】与其位置【下标】用HashMap关联起来
- 要注意【数组中同一个元素在答案里不能重复出现】
Java代码(测试用例52错)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
int len = nums.length;
for(int i=0; i<len; i++){
hashMap.put(nums[i], i);
}
for(int i=0;i<len;i++){
if(hashMap.containsKey(target-nums[i])){
return new int[]{hashMap.get(target-nums[i]), i};
}
}
return new int[0];
}
}
起初看过官网题解,仅仅是把数组的值和下标关联起来,但是发现报错了(错误原因:输出了相同的元素)
所以官网题解是上来直接遍历的数组,若是不存在则把值和下标放到HashMap里,这样可以保证,相同的元素不会在答案中出现两次(哎,这么简单的问题都要想想 |_| )
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
int len = nums.length;
for(int i=0;i<len;i++){
if(hashMap.containsKey(target-nums[i])){
return new int[]{hashMap.get(target-nums[i]), i};
}
hashMap.put(nums[i], i);
}
return new int[0];
}
}
C++代码(旧)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> flag(2);
for(int i=0;i<nums.size();i++){
flag[0]=i;
int temp=target-nums[i];
for(int j=i+1;j<nums.size();j++){
if(nums[j]==temp){
flag[1]=j;
break;
}
}
if(flag[1]!=0) break;
}
return flag;
}
};