Lintcode--2(56)--两数之和
生活随笔
收集整理的這篇文章主要介紹了
Lintcode--2(56)--两数之和
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:給一個(gè)整數(shù)數(shù)組,找到兩個(gè)數(shù)使得他們的和等于一個(gè)給定的數(shù) target。
? ? ? 你需要實(shí)現(xiàn)的函數(shù)twoSum需要返回這兩個(gè)數(shù)的下標(biāo), 并且第一個(gè)下標(biāo)小于第二個(gè)下標(biāo)。注意這里下標(biāo)的范圍是 0 到 n-1。注意事項(xiàng)
? ? ?你可以假設(shè)只有一組答案。
樣例
? ? ?給出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
1.暴力搜索,復(fù)雜度為O(n2)
class Solution { public: /* * @param numbers: An array of Integer * @param target: target = numbers[index1] + numbers[index2] * @return: [index1 + 1, index2 + 1] (index1 < index2) */vector<int> twoSum(vector<int> &numbers, int target) { // write your code here vector<int> idx(2);//申請(qǐng)一個(gè)大小為2的容器存放下標(biāo) for(int i=0; i<numbers.size(); i++) { for(int j=numbers.size()-1; j>=0; j--) { if(numbers[i]+numbers[j]==target && i!=j) { idx[1] = i; idx[0] = j; } } }if(idx[0]>idx[1])//交換兩數(shù) { idx[0] = idx[0]^idx[1]^idx[0];//方法錯(cuò)誤,輸出的都是0 idx[1] = idx[0]^idx[1]^idx[1];}return idx;} }; ? ?注意:上述交換兩數(shù)的方法輸出的都是02、哈希表,復(fù)雜度為O(n)?
? ? 原理:基本原理:創(chuàng)建一個(gè)hashmap,先把所有的值存在hashmap中,其中關(guān)鍵字key是元素的值,value為對(duì)應(yīng)元素的下標(biāo)。待查找的關(guān)鍵字為target - nums[i],遍歷數(shù)組直到找到則返回其在數(shù)組中的下標(biāo)。時(shí)間復(fù)雜度為O(n)。
class Solution { public:/** @param numbers : An array of Integer* @param target : target = numbers[index1] + numbers[index2]* @return : [index1+1, index2+1] (index1 < index2)*/vector<int> twoSum(vector<int> &nums, int target) {// write your code hereint size = nums.size();int i = 0;vector<int> result;//這里不能定義長(zhǎng)度為2,否則會(huì)輸出四個(gè)數(shù)if(size < 2) //判斷是否為空{(diào)return result;}map<int, int> hashMap;//創(chuàng)建一個(gè)map,key是元素的值,value是元素原來(lái)的下標(biāo)for(i=0; i<size; i++) {hashMap.insert(pair<int, int>(nums[i], i));//把所有的元素值和下標(biāo)插入到map}for(i=0; i<size; i++) {int temp = target - nums[i];if (hashMap.count(temp)!=0 && hashMap[temp]!=i) //hashMap.count(temp)是temp在表中出現(xiàn)的次數(shù){result.push_back(i);result.push_back(hashMap[temp]);break;//只要找到就跳出循環(huán)}}if(result[0] > result[1]) //調(diào)整大小順序{int temp = result[0];result[0] = result[1];result[1] = temp;}return result;} }; 參考:1.https://www.cnblogs.com/libaoquan/p/6808064.html? ? ? ? ?2.http://blog.csdn.net/kkdd2013/article/details/51953035
總結(jié)
以上是生活随笔為你收集整理的Lintcode--2(56)--两数之和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Lintcode--3(366)--斐波
- 下一篇: Lintcode--4(1)--A+B