长大后想做什么?做回小孩!

0%

LeetCode——两数之和I&II

两数之和 I 简单、两数之和 II 简单

NO.1 两数之和 简单

QMw3c9.png

思路一:暴力法 看到题,最先想到的思路就是暴力解法,直接两层for循环遍历:

1
2
3
4
5
6
7
8
9
10
public int[] twoSum(int[] nums,int target){
for (int i=0;i<nums.length;i++){
for (int j=i+1;j<nums.length;j++){
if (nums[i]+nums[j]==target) {
return new int[]{i,j};
}
}
}
throw new IllegalArgumentException("no result!");
}

时间复杂度:O(n^2)

思路二:哈希表法 通过一个哈希表来空间换时间:1.遍历nums数组,判断每个元素和目标值的差temp是否在哈希表中。2.如果在就返回当前遍历元素的下标和哈希表中temp这个key对应的value。3.如果不在就将当前遍历元素作为key、当前遍历元素下标作为value存入哈希表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int[] twoSum(int[] nums,int target){
Map<Integer,Integer> map =new HashMap<Integer,Integer>();

for (int i=0;i<nums.length;i++){
int temp=target-nums[i];
// 所需要的temp是否在map中,如果在就返回map中temp值对应的value(即temp值对应的下标)和i。
if (map.containsKey(temp)){
return new int[]{map.get(temp),i};
}
// temp如果不在map中,就将nums[i]作为key、下标i作为value放入map中
map.put(nums[i],i);
}
throw new IndexOutOfBoundsException("no twoSum result!");
}

时间复杂度:O(n) 空间复杂度:O(n)

NO.167 两数之和 II 简单

YQIckj.png

思路一:双指针 双指针遍历数组,如果第 i 个元素加第 j 个元素的和 sum 等于 target 返回[i+1,j+1];

如果 sum > target 说明需要更小的数字,则 j– ;如果 sum < target 说明需要更大的数字,则 i++ 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int[] twoSum(int[] numbers, int target) {
int i = 0, j = numbers.length - 1;
while (i < j) {
int sum = numbers[i] + numbers[j];
if (sum == target) {
return new int[]{i + 1, j + 1};
} else if (sum > target) {
j--;
} else {
i++;
}
}
throw new IllegalArgumentException();
}

时间复杂度:O(n)


本人菜鸟,有错误请告知,感激不尽!

更多题解和学习记录博客:博客github