一、1. 兩數之和數組
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。數組是無序的,返回對應下標。spa
你能夠假設每一個輸入只對應一種答案,且一樣的元素不能被重複利用。指針
示例:code
給定 nums = [2, 7, 11, 15], target = 9 由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; if(nums.empty()) return res; unordered_map<int,int> m; for(int i=0;i<nums.size();++i) m[nums[i]]=i; for(int i=0;i<nums.size();++i) { int t = target-nums[i]; if(m.count(t) && m[t] != i) //找到,而且不是以前的數 { res.push_back(i); res.push_back(m[t]); break; } } return res; } };
二、15. 三數之和blog
給定一個包含 n 個整數的數組 nums
,判斷 nums
中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出全部知足條件且不重複的三元組。排序
注意:答案中不能夠包含重複的三元組。three
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4], 知足要求的三元組集合爲: [ [-1, 0, 1], [-1, -1, 2] ]
首先,兩數和問題這樣作。先對數組中的數進行排序,再設置兩個指針,一個指向頭,一個指向尾。判斷兩數和是否等於想要的數,若是是則在結果集添加這個數組;若是小了說明左邊指針指向的數小了,所以左指針右移;反之若是大了則右指針左移。
嘗試把三數和問題轉化爲兩數和問題:一樣先對數組排序,設置三個指針p,q,r,p指針指向第一個數x,則q,r要指向數組中剩餘數中的兩個,而且指向的兩數和爲-x,從而轉化爲兩數和問題。對p指向第一個數的狀況分析完畢後,不可能再有知足題意且包含x的狀況,因而p右移。這樣一直分析到p指向數組中倒數第三個數的狀況。注意跳過全部重複的狀況。get
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; if(nums.size()<3) return res; sort(nums.begin(),nums.end()); // 首先排序 vector<int> temp(3); int len = nums.size(); for(int i=0;i<len-2;++i) // 首先固定一個變量,把三數之和變爲兩數之和的問題。 { temp[0] = nums[i]; int sum = -nums[i]; int j=i+1,k=len-1; while(j<k) { int curSum = nums[j]+nums[k]; if(curSum == sum) { temp[1] = nums[j++]; temp[2] = nums[k--]; res.push_back(temp); while(j<k && nums[j]==nums[j-1]) // 去重操做 j++; while(j<k && nums[k]==nums[k+1]) k--; } else if(curSum < sum) j++; else k--; } while(i < len-2 && nums[i+1] == nums[i]) // 對於固定的數也要去重 i++; } return res; } };