1. 程式人生 > >Leetcode刷題——三數之和

Leetcode刷題——三數之和

大噶猴,前一段比較忙,刷題日記被耽擱了一段時間,從今天起開始恢復。

今天開始刷leetcode中等難度的演算法題了,第一道是三數之和,看下題目要求:

思路:

好久沒刷題了手非常生,思路也很枯竭,只想到了暴力迴圈,找到所有相加等於零的vector之後對每一個vector做一個排序然後判斷是否相等,erase掉相同的元素。程式碼是這樣的:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> temp;
      
        int len = nums.size();
        int sum = 0;
        for(int m = 0;m < len;m++){
            for(int n = m + 1;n < len;n++){
                for(int o = n + 1;o < len;o++){
                    sum = nums[m] + nums[n] + nums[o];
                    if(sum == 0){
                        temp.push_back(nums[m]);
                        temp.push_back(nums[n]);
                        temp.push_back(nums[o]);
                        result.push_back(temp);
                        temp.clear();
                    }
                    sum = 0;
                }
            }
        }
        int l = result.size();
        for(int x = 0;x < l;x++){
            sort(result[x].begin(),result[x].end());
        }
        for(int y = 0;y < l;y++){
            for(int z = y + 1;z < l;z++){
                if(result[y] == result[z]){
                    result.erase(result.begin() + z);
                    l--;
                    z--;
                }
            }
        }
        return result;
    }
};

可以成功跑通,但是超出了時間限制,非常悲傷。

然後借鑑了別人的思路,可以對輸入的數字先做一個排序,對負數部分進行迴圈,看其後面的兩數相加是否能與它抵消,當然如果第一個數就是整數就是無解的輸入。在計算後面兩數的和的時候我們可以設兩個迭代器,一個從這個數後第一個數開始,一個從最後一個數開始,如果加和小了就移動第一個迭代器,如果加和大了就移動第二個迭代器,就可以遍歷所有情況了。而且因為數字整個都是排序的,如果有重複數字肯定是相鄰的,我們在處理完前一個數之後,如果後一個數與之相等就刪掉,這樣避免了重複情況的出現。程式碼如下:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        for (int k = 0; k < nums.size(); ++k) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int target = 0 - nums[k];
            int i = k + 1, j = nums.size() - 1;
            while (i < j) {
                if (nums[i] + nums[j] == target) {
                    res.push_back({nums[k], nums[i], nums[j]});
                    while (i < j && nums[i] == nums[i + 1]) ++i;
                    while (i < j && nums[j] == nums[j - 1]) --j;
                    ++i; --j;
                } else if (nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return res;
    }
};

可見刷題是不能斷的,感覺自己退步了,sad,還有很多要學習,加油!

我們下期見!

相關推薦

Leetcode——之和

大噶猴,前一段比較忙,刷題日記被耽擱了一段時間,從今天起開始恢復。今天開始刷leetcode中等難度的演算法題了,第一道是三數之和,看下題目要求:思路:好久沒刷題了手非常生,思路也很枯竭,只想到了暴力迴圈,找到所有相加等於零的vector之後對每一個vector做一個排序然後

LeetCode演算法——之和

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 例如, 給

leetcode--兩之和(簡單)

一、序言   第一次刷leetcode的題,之前從來沒有刷題然後去面試的概念,直到臨近秋招,或許是秋招結束的時候才有這個意識,原來面試是需要刷題的,面試問的問題都是千篇一律的,只要刷夠了題就差不多了,當然你的基礎也要紮實,畢竟在技術面的時候很容易露餡的。   所以奉勸各位還未畢業,在大三或大二的師弟師妹早

LeetCode第15 之和

i++ while 剪枝 right ger 超時 分析 leetcode 復雜度 /* 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。 註意:答案中不可

LeetCode 15 3sum 之和

題目連結 https://leetcode-cn.com/problems/3sum/ 題意         很簡單,就是給出一個數組,3個數一組,找到所有和為0的組。並且要求不能重複。或者說找其中3個數其和為0,找出所有的組合。 題解

Leetcode 923:之和的多種可能(最詳細的解法!!!)

給定一個整數陣列 A,以及一個整數 target 作為目標值,返回滿足 i < j < k 且 A[i] + A[j] + A[k] == target 的元組 i, j, k 的數量。 由於結果會非常大,請返回 結果除以 10^9 + 7 的餘數。 示例 1:

leetcode第一之和python實現

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [

LeetCode】15 之和3Sum

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0? 找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4], 滿足

LeetCode】#15之和(3Sum)

【LeetCode】#15三數之和(3Sum) 題目描述 給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 示例 例如, 給

leedcode第15之和詳解

vector<vector<int>> leedcode15::easy_threeSum(vector<int>& nums) { /** * 巧妙解法:其中有一些剪枝優化的思想 * 1、先對給

leetcode 第一之和

1、暴力解法 兩個巢狀for迴圈可以解決(188ms) 2、利用map資料結構 用給出的矩陣構建map,只需要用兩個並列的for迴圈(12ms) class Solution { public:

[Leetcode] Python3 實現之和

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。  例如, 給定陣列 nums = [-1, 0, 1, 2, -1,

leetcode-15:3sum 之和

題目: Given an array nums of n integers, are there elements a, b, c in nums such that&n

LeetCode 15 — 3Sum(之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the arra

LeetCode之 15.之和 (3Sum)總結

生命不止,刷題不息~~~~~~ 前兩天就一直在做15.三數之和,這個題在LeetCode和LeetCode中國上獲贊很多,絕對的好題啊!不過,我喜歡這個題僅僅是因為它採用了快速排序的思想啦。 從捋清思路到程式碼實現,突破重重Bugs大關,終於提交成功,對於小白而言,實屬不

leetcod---兩之和

吐槽 今天好冷哇哇哇,真的是凍死人了,今天看貓貓老睡在那裡,然後我過去就舔我的手和臉emmmm。 題目 兩數之和給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums

LeetCode(15. 之和

sel sum 元組 app 判斷 print for .so 整數 問題描述 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。 註意:答案中不可以包含重復的三

力扣(LeetCode)15. 之和

-- 整數 -c 去重 clas pub lis inf 分享 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。 註意:答案中不可以包含重復的三元組。 例如,

LeetCode-001兩之和

不能 OS malloc turn get ++ return 個數 答案 給定一個整數數列,找出其中和為特定值的那兩個數。你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。示例:給定 nums = [2, 7, 11, 15], target = 9因為 nums

leetcode 簡單】第十七之和 II - 輸入有序數組

nbsp def art col else ber clas 不可 strong 給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。 函數應該返回這兩個下標值index1 和 index2,其中 index1 必須小於 index2。 說明: 返