1. 程式人生 > >15. 3Sum,16. 3Sum Closest,18. 4Sum(最後一個方法重要)重要

15. 3Sum,16. 3Sum Closest,18. 4Sum(最後一個方法重要)重要

第一題、15. 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
二分查詢的思想

vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int> > ret;
        int size = num.size();
        sort(num.begin(), num.end());
        for(int i = 0; i < size; i ++)
        {
            //skip same i
            while(i > 0 && i < size && num[i] == num[i-1
]) i ++; int j = i + 1; int k = size - 1; while(j < k) { int sum = num[i] + num[j] + num[k]; if(sum == 0) { vector<int> cur(3); cur[0] = num[i]; cur[1
] = num[j]; cur[2] = num[k]; ret.push_back(cur); j ++; k --; //skip same j while(j < k && num[j] == num[j-1]) j ++; //skip same k while(k > j && num[k] == num[k+1]) k --; } else if(sum < 0) { j ++; } else { k --; } } } return ret; }

第二題:16. 3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

int threeSumClosest(vector<int>& nums, int target) {
        vector<vector<int> > ret;
        int size = nums.size();
        sort(nums.begin(), nums.end());
        int sum = nums[0]+nums[1]+nums[size-1];
        int minDis = sum - target;
        for(int i = 0; i < size; i++)
        {
            int j = i + 1;
            int k = size -1;
            while(j<k)
            {
                sum = nums[i]+nums[j]+nums[k];
                if(abs(sum - target) < abs(minDis))
                {
                    minDis = sum - target;
                }

                //minDis = sum - target;
                if(sum == target)//增加這部分處理,是對於{1,2,3,4,5,6,7} target=10,這種一旦找到1,2,7三個數,則不用繼續遍歷,繼續
                {
                    return target;
                }
                else if(sum > target)
                {
                    k--;
                }
                else
                {
                    j++;
                }
            }
        }

        return minDis + target;
    }

第三題、18. 4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

/*
    對陣列排序
    確定四元數中的前兩個(a,b)
    遍歷剩餘陣列確定兩外兩個(c,d),確定cd時思路跟3Sum確定後兩個資料一樣,二分查詢左右逼近。
    在去重時採用set集合
    */
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        set<vector<int>> setRes;
        int len = nums.size();
        sort(nums.begin(),nums.end());
        if(len < 4)
        {
            return (vector<vector<int>> ());
        }

        /*
        for(int i = 0; i < len; i++)
        {
            for(int j = i + 1; j < len; j++)
        */
        for(int i = 0; i < len - 3; i++)
        {
            for(int j = i + 1; j < len - 2; j++)
            {
                //二分查詢
                int begin = j + 1;
                int end = len -1;
                while(begin < end)
                {

                    int sum = nums[i] + nums[j] + nums[begin] + nums[end];
                    if(sum == target)
                    {
                        vector<int> temp;
                        temp.push_back(nums[i]);
                        temp.push_back(nums[j]);
                        temp.push_back(nums[begin]);
                        temp.push_back(nums[end]);
                        setRes.insert(temp);
                        begin++;
                        end--;
                    }
                    else if(sum > target)
                    {
                        end--;
                    }
                    else
                    {
                        begin++;
                    }
                }
            }
        }

        set<vector<int>>::iterator iter;
        for(iter = setRes.begin(); iter!=setRes.end(); iter++)
        {
            result.push_back(*iter);
        }

        return result;

    }

時間複雜度更低的程式碼:

vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> total;
        int n = nums.size();
        if(n<4)  return total;
        sort(nums.begin(),nums.end());
        for(int i=0;i<n-3;i++)
        {
            if(i>0&&nums[i]==nums[i-1]) continue;
            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
            if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]<target) continue;
            for(int j=i+1;j<n-2;j++)
            {
                if(j>i+1&&nums[j]==nums[j-1]) continue;
                if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
                if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target) continue;
                int left=j+1,right=n-1;
                while(left<right){
                    int sum=nums[left]+nums[right]+nums[i]+nums[j];
                    if(sum<target) left++;
                    else if(sum>target) right--;
                    else{
                        total.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
                        do{left++;}while(nums[left]==nums[left-1]&&left<right);
                        do{right--;}while(nums[right]==nums[right+1]&&left<right);
                    }
                }
            }
        }
        return total;
    }

相關推薦

15. 3Sum16. 3Sum Closest18. 4Sum最後一個方法重要重要

第一題、15. 3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in

float轉16進位制 16進位制轉floatjava

直接上程式碼,有需求的朋也可以檢視下: package com.sondon.dev_soceket.test; /** * @Project : 硬體通訊 * @Package : com

AndroidManifest.xml裏加入不同package的component Activity、Service裏android:name裏指定的值一般為句號加類名可以通過指定完全類名包名+類名來解決

代碼 gui 目的 tools 註冊 不同 res 收藏 small 我們都知道對於多個Activity如果在同一個包中,在Mainfest中可以這樣註冊 Xml代碼 <span style="font-size: small;"><?xml

eclipse批量替換修改變量名或單詞兩種方法

.com 雙擊 方框 批量 ref lac cnblogs height ima 第一種(常用):   ①如圖:雙擊選中變量名id,右鍵選擇Refactor中的Rename   ②之後如下圖所示,紅箭頭的帶有方框的就是選中修改的變量名,此時修改提示框的內容,後面帶方框的也

寫不了不會告辭。程序員三連第二次站立議會

昨天 nbsp 會議 安卓 暫時 ima view 構建 困難 目前的進度: 個人進度: 劉子琦:已經熟悉安卓開發軟件的使用,計劃最近一個站立議會完成2個頁面開發,問題目前對Android結構理解較淺 陳藝祥:初步學習了sql server,學會了建表等基本操作,計劃

縱裏尋她千百度暮然回首那人卻在燈火闌珊處微信三方登陸

判斷 esp sage 邏輯判斷 平臺 hat 小技巧 開放平臺 註意 小插曲就是app做微信三方登陸是很久之前,後面又添加了PC的微信三方登陸,而文檔上說unionid是同一個賬號下不同應用統一的,但是app拿的是uid,導致pc拿的unionid始終對不上,導致浪費了一

零基礎自學人工智能看這些資料就夠了300G資料免費送

工具 flow 領取 學習 講解 及其 需要 量化 決策 為什麽有今天這篇?首先,標題不要太相信,哈哈哈。 本公眾號之前已經就人工智能學習的路徑、學習方法、經典學習視頻等做過完整說明。但是鑒於每個人的基礎不同,可能需要額外的學習資料進行輔助。特此,向大家免費發送近300G的

人工智能時代人類會被秒殺?楚才國科

即將 超過 ron 收益 效率 高效 同仁 機器 webp 人工智能像一把利刃,將時代劈斬為涇渭分明的兩個板塊:在人工智能到來之前,世界上的一切循規蹈矩,有序進行;人工智能到來之後,未來勢必是一個大變革的時代,所有的秩序和契約都會被重新撰寫。 自從深度學習發明以來,越來越

一個控制器返回後控制器所屬的tabbarController沒選中tabbarItem圖示不亮

最近在使用UITabbarController遇到一個問題,就是所屬tabbarController的一個控制器,在使用popViewControllerAnimated方法回到tabbarController時,控制器所屬的tabbarItem沒有顯示選中。可以在AppDelegate.m中的

關於比較器我們知道我們java陣列中可以使用一個方法:Array.sort(array);來進行排序

關於比較器,我們知道我們java陣列中可以使用一個方法:Array.sort(array);來進行排序,如果我們陣列中是放的基本資料型別,就可以直接比較大小排序,如果我們放的是物件的話,這樣排序就意義不大,需要我們自己進行相應的修改,得到我們想要的比較結果。 比如我們有三個學生,學生屬性有id,

Java前端Rsa公鑰加密後端Rsa私鑰解密支援字元和中文

Java前端Rsa公鑰加密,後端Rsa私鑰解密(支援字元和中文)   package com.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import j

十大經典排序演算法動畫與解析看我就夠了!配程式碼完全版

GitHub Repo:Sort Article Follow: MisterBooo · GitHub 排序演算法是《資料結構與演算法》中最基本的演算法之一。 排序演算法可以分為內部排序和外部排序。 內部排序是資料記錄在記憶體中進行排序。 而外部排序是因排序的資料很大,一次不能容納全部的排

後端不來過夜半閒敲mock落燈花mockjs+Vuex+Vue實戰

Mock的由來【誤】 黃梅時節家家雨,青草池塘處處蛙。 後端不來過夜半,閒敲mock落燈花 趙師秀:南宋時期的一位前端工程師 詩詞背景:在一個梅雨紛紛的夜晚,正處於專案編碼階段,書童卻帶來訊息:“寫後端的李秀才在幾個時辰前就趕往臨安度假去

我有500w個單詞你幫忙設計一個數據結構來進行儲存存好之後我有兩個需求。程式人生程式碼copy

 1、來了一個新的單詞,需要判斷是否在這500w個單詞中 2、來了一個單詞字首,給出500w個單詞中有多少個單詞是該字首 package cango.scf.common.util; import java.util.HashMap; import java.util.

【C++】提醒使用者輸入數字如何處理使用者錯誤輸入?優秀的程式設計思想

你提醒使用者一定要輸入5個數字 但是使用者故意輸入2個數字,一個其他字元,再輸入其他數字, 你該怎麼處理這樣的普遍情況? 解決辦法: 用到cin的bool特性! #include <iostream> const int Max = 5; int main() { us

程式基本演算法習題解析 如果有兩個數每一個數的所有約數除它本身以外的和正好等於另一個數則稱這兩個數為互滿數。求出3000以內所有的互滿數並輸出。

題目:         如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等於另一個數,則稱這兩個數為互滿數。求出3000以內所有的互滿數並輸出。 先附上程式碼: // Chapter1_8.cpp : Defines the entry p

收官蓉城展望2019多媒體技術新方向內附資料下載

伴隨著2018年音視訊技術生態的風起雲湧,LiveVideoStack多媒體開發技術沙龍收官蓉城,在對過去一年技術梳理的同時,各位大咖也對明年發展趨勢做了展望:5G時代即將來臨,蘋果、高通從“芯”開戰,音視訊技術又將有怎樣變化?在H.265、AVS2、AV1爭鬥正酣時,AV2、H.266將在

tomcat中部署好的專案內網和localhost可以訪問但是外網不能訪問Windows 2008 R2中

在Windows 2008 R2用tomcat搭建環境能夠執行web專案,在本地用localhost或者內網可以訪問網站,但是外網均無法訪問網站,發現有三種可能性致使這種情況發生: 第一種情況:防火牆

不止20kPython薪酬又飆升了?內附轉型指南

Python 誕生之初就被譽為最容易上手的程式語言。進入火熱的 AI 人工智慧時代後,它也逐漸取代 Java,成為程式設計界的頭牌語言。更有碼農圈金句:「學完 Python,可以上天」佐證其火熱程

Python+OGR庫學習:讀取點向量檔案屬性值和座標並儲存為TXT一行一個要素值

程式碼思路: 1、匯入相關庫包,切換到當前資料夾 2、註冊驅動,開啟點向量檔案,獲取圖層 3、開啟待寫入TXT檔案 4、遍歷要素: (1)獲取當前要素‘ID’和‘cover’欄位屬性 (2)獲取當前點要素對應幾何物件和其座標值X,Y (3)將ID、cover、X、Y寫入TXT檔案 (