【LeetCode & 劍指offer刷題】陣列題3:3Sum(系列) + 4sum
阿新 • • 發佈:2019-01-05
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)
3Sum
Given an array nums of n integers, are there elements a , b , c in numsC++
/* 問題:離目標值最近的三數之和 方法:排序後,掃描 a[i], 後面在用 left 和 right 首尾兩指標掃描 */ class Solution { public : int threeSumClosest ( vector < int >& nums , int target ) { if ( nums . size ()< 3 ) return 0 ; int closest = nums [ 0 ] + nums [ 1 ] + nums [ 2 ]; int diff = abs ( closest - target ); sort (nums.begin(), nums.end()); //排序 //掃描a[i],後面在用left和right首尾兩指標掃描 for ( int i = 0 ; i < nums . size () - 2 ; i ++) //i=0~n-3(n-2,n-1 分別為 left 和 right 佔著 ) { int left = i + 1 , right = nums . size () - 1 ; // left = i+1, right=n-1 while ( left < right ) { int sum = nums [ i ] + nums [ left ] + nums [ right ]; int newDiff = abs ( sum - target ); if ( newDiff < diff ) // 更新 diff 和 sum { diff = newDiff ; closest = sum ; } if ( sum < target ) left ++; // 調節指標 else right --; } } return closest ; } }; 18. 4Sum Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums 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. Example: Given array nums = [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] ]
Seen this question in a real interview before? Yes No /* 問題:找與目標值相等的 4 個數 三重迴圈即可 用 set 可避免重複結果 */ class Solution { public : vector < vector < int >> fourSum ( vector < int > & nums , int target ) { if ( nums . size () < 4 ) return vector < vector < int >>(); // 或者用 {{}} set <vector<int>> res; sort ( nums . begin (), nums . end ()); // 掃描 a[i],a[j] 後面接 left,right 兩個指標 for ( int i = 0 ; i < int ( nums . size () - 3 ); i ++) { for ( int j = i + 1 ; j < int ( nums . size () - 2 ); j ++) { // if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 遇到重複數時不執行下面語句,如果用 set 可以不進行此判斷 int left = j + 1, right = nums.size() - 1; //i=0~n-4,j=i+1~n-3 while ( left < right ) { int sum = nums [ i ] + nums [ j ] + nums [ left ] + nums [ right ]; if ( sum == target ) { vector < int > out { nums [ i ], nums [ j ], nums [ left ], nums [ right ]}; res . insert ( out ); // 用 set, 當有重複結果時,插入會失敗 left ++; right --; } else if ( sum < target ) left ++; else right --; } } } return vector < vector < int >>( res . begin (), res . end ()); //由set轉化為vector輸出 } };