leetcode 1:兩數之和
題目:1. 兩數之和
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一
暴力解法,這個只要找到一個解就可以,我們可以遍歷兩遍數組。
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
int j = i+1;
while(j<nums.length){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
j++;
}
}
return null;
}
解法二
以空間換時間,用hashMap裏面有個contains方法,我們首先遍歷一遍數組,把裏面的數據全都放map裏面去.
之後遍歷數組,數組中的每個元素,找同target的差是否在map裏面。這個地方要注意,找到的那個value不能等於i。
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++)
{
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
int a = target - nums[i];
if(map.containsKey(a)&& map.get(a)!=i){
return new int[]{i,map.get(a)};
}
}
return null;
}
解法三
不直接遍歷數組把元素都放到map裏面,這樣的話會多一遍循環,直接一遍循環過去,這個我現在能想通爲什麼,但是話到嘴邊,不知道怎麼說。
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
int a = target - nums[i];
if(map.containsKey(a)&& map.get(a)!=i){
return new int[]{i,map.get(a)};
}
map.put(nums[i],i);
}
return null;
}
準備以後每天一道吧,今天這個是LeetCode上第一道題,比較簡單,但感覺也能讓人眼前一亮。以後每天一道,寫博客明志。