題號1:
難度: 簡單
題目:
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9 因爲 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
思路: 1. 採用暴力法,直接雙重循環遍歷,時間複雜度o(n2)。 2.比較推薦,使用map映射,每次將出現過得數存儲起來o(n)
代碼:
public class _1_TWO_SUM_1 {
public static void main(String[] args) {
int [] nums = {2, 7, 11, 15};
int target = 9;
System.out.println(Arrays.toString(twoSum(nums,target)));
System.out.println(Arrays.toString(twoSum2(nums,target)));
}
/**
* 思路: 快排法:
* 遍歷元素和後面的每個元素做比較
* 複雜度: O(n2)
* 結果:
* 執行用時 :69 ms, 在所有 Java 提交中擊敗了26.61% 的用戶
* 內存消耗 :39.9 MB, 在所有 Java 提交中擊敗了5.06% 的用戶
*/
public static int[] twoSum(int[] nums, int target) {
int [] result = new int[2];
for(int i=0; i<nums.length -1; i++){
for(int j = i+1; j<nums.length; j++){
if(nums[i] + nums[j] == target){
result[0] = i;
result[1] = j;
return result;
}
}
}
return null;
}
/**
* 思路: hash映射,利用hashMap:
* 將數組的索引和數組的值存入hashMap中,key是這個數,value是索引,方便查詢
* 每次存的時候,查一下對應的 target-i 是否在hashMap
* 中存在,存在則直接返回結果
* 複雜度: O(n)
* 結果:
* 執行用時 :3 ms, 在所有 Java 提交中擊敗了 87.45% 的用戶
* 內存消耗 :39.8 MB , 在所有 Java 提交中擊敗了 5.06% 的用戶
*/
public static int[] twoSum2(int[] nums, int target) {
int [] result = new int[2];
Map<Integer,Integer> map = new HashMap<>();
for(int i=0; i<nums.length; i++){
int num1 = nums[i]; // 數組中的數
int num2 = target - num1; //要找的另一個數
Integer index = map.get(num2);
if(index != null){
result[0] = index;
result[1] = i;
return result;
}
map.put(num1,i);
}
return null;
}
}
希望對大家有幫助。