日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode-18-4Sum

發布時間:2023/11/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode-18-4Sum 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題描述

  給定一個數組S,和一個int類型的數target,在S中尋找四個數,這四個數之和為target。返回一個vector<vector<int>>

  例子:S={1, 0, -1, 0, -2, 2},target = 0.返回結果為{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}

二、問題解決

  最簡單的思路是四層循環,這樣不管是之前的3之和問題還是4之和問題都能解決,缺點就是比較費時,在leetcode上提交還可能超時。

  更好一點的方式是對數組進行排序之后,從兩邊逼近的方式。這樣可以減少一層循環,3數之和就先確定一個數,4數之和就先確定兩個數。本題下面的解法之中,固定i和j,讓k和l沖兩邊逼近。

  這題比較麻煩的是去重復。

vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;if (nums.size() < 4) return result;sort(nums.begin(),nums.end());/*for (auto o : nums)cout << o;cout << endl;*/for (int i = 0; i < nums.size() - 3; i++) {
     //去除重復
while (i != 0 && nums.at(i - 1) == nums.at(i))i++;for (int j = i + 1; j < nums.size() - 2; j++) {
       //去除重復
while (j != i + 1 && j+1 <nums.size()-1&& nums.at(j-1) == nums.at(j))j++;int k = j + 1, l = nums.size()-1;while (k < l) {//cout << i << j << k << l << endl;if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) == target) {vector<int> temp;temp.emplace_back(nums.at(i));temp.emplace_back(nums.at(j));temp.emplace_back(nums.at(k));temp.emplace_back(nums.at(l));result.emplace_back(temp);
            //去除重復
while (k + 1 < l && nums.at(k) == nums.at(k + 1))k++;while (l-1 > k && nums.at(l) == nums.at(l - 1))l--;k++;}if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) > target)l--;if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) < target)k++;}}}//result.erase(unique(result.begin(), result.end()),result.end());return result; }

?

轉載于:https://www.cnblogs.com/likaiming/p/8280311.html

總結

以上是生活随笔為你收集整理的LeetCode-18-4Sum的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。