@lc app=leetcode.cn id=1java
[1] 兩數之和git
leetcode-cn.com/problems/tw…github
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。算法
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。數組
示例:app
給定 nums = [2, 7, 11, 15], target = 9post
由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]ui
這道題目給了咱們一個數組,還給了咱們一個目標值 target 讓咱們找到兩個數組,使其和爲 target,乍一看這道題可使用暴力搜索,這裏使用暴力搜索必然使用雙重 for 循環,那這個題目的解法的時間複雜度就是 O(n^2),爲了用空間換取時間,咱們只能想一個時間複雜度是 O(n) 的算法來實現,咱們既然已經決定使用線性時間複雜度來解決問題,就只能遍歷遍歷一個數字,可是另一個數字該怎麼辦呢?spa
咱們須要將其存儲起來,使用 HashMap 來創建數字和座標之間的映射,咱們知道 HashMap 是常數級別的查找效率,這樣在遍歷數組的時候,用 target 減去遍歷到的數字,好比 target 是 4,遍歷到了一個 2,那麼另一個 2 不能是以前那個 2,整個實現步驟爲:先遍歷一遍數組,創建 HashMap 映射,而後再遍歷一遍,開始查找,找到則記錄 index。代碼以下:code
雖然暴力破解法不是那樣的完美,可是在數據規模小的時候也算是一種能夠接受的方法
java 解法一:
class Solution {
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[j] == target - nums[i] ){
// 返回一個新的數組
return new int[]{i, j};
}
}
}
// 找不到對應的數字 拋出異常
throw new IllegalArgumentException("No two sum solution");
}
}
複製代碼
JavaScript 解法一:
/** * @param {number[]} nums * @param {number} target * @return {number[]} */
let twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] === target - nums[j]) {
return [i,j];
}
}
}
throw new Error('No two sum solution');
};
複製代碼
java 解法二:
class Solution {
public int[] twoSum(int[] nums, int target) {
// 建立一個泛型Hashmap
HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
int[] res = new int[2];
// 遍歷數組,將數組中的元素作一個 變成Hashmap的映射
for (int i = 0; i < nums.length; i++) {
m.put(nums[i], i);
}
for (int i = 0; i < nums.length; ++i) {
int t = target - nums[i];
// 若是在m 中找到t 而且這個元素的索引不是本身當前的索引
if (m.containsKey(t) && m.get(t) != i) {
res[0] = i;
res[1] = m.get(t);
}
}
return res;
}
}
複製代碼
JavaScript 解法二:
/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {
let map = new Map();
let res = [];
// 第一遍遍歷數組作map 映射
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i);
}
// 第二遍 進行查找
for (let index = 0; index < nums.length; index++) {
let t = target - nums[index];
if (map.has(t) && map.get(t) != index) {
res.push(index);
res.push(map.get(t));
break;
}
}
return res;
};
複製代碼
詳情請點擊:原文連接