2020-12-25 Daily-Challenge
Today I have done 3Sum, 3Sum Closest and 4Sum on leetcode and leetcode's December LeetCoding Challenge with cpp
.
3Sum
Description
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 array which gives the sum of zero.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Example 2:
Input: nums = []
Output: []
Example 3:
Input: nums = [0]
Output: []
Constraints:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
Solution
two pointers
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> answer;
for(int i = 0; i < len-2; ++i) {
if(i && i < len-2 && nums[i] == nums[i-1]) continue;
int begin = i+1, end = len-1;
while(begin < end) {
if(nums[begin]+nums[end] == -nums[i]) {
answer.push_back(vector<int>{nums[i], nums[begin], nums[end]});
int curBegin = nums[begin];
int curEnd = nums[end];
while(begin < end && nums[begin] == curBegin) ++begin;
while(begin < end && nums[end] == curEnd) --end;
} else if (nums[begin]+nums[end] < -nums[i]) {
++begin;
} else {
--end;
}
}
}
return answer;
}
};
3Sum Closest
Description
Given an array nums
of n integers and an integer target
, find three integers in nums
such that the sum is closest to target
. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example 1:
Input: nums = [-1,2,1,-4], target = 1
Output: 2
Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Constraints:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
Solution
two pointers
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int diff = INT_MAX;
int answer = -1;
int len = nums.size();
sort(nums.begin(), nums.end());
for(int i = 0; i < len-2; ++i) {
if(i && i < len-2 && nums[i] == nums[i-1]) continue;
int begin = i+1, end = len-1;
while(begin < end) {
int curSum = nums[i] + nums[begin] + nums[end];
int curDiff = abs(curSum-target);
if(curDiff < diff) {
diff = curDiff;
answer = curSum;
}
if (curSum < target) {
++begin;
} else {
--end;
}
}
}
return answer;
}
};
4Sum
Description
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
.
Notice that the solution set must not contain duplicate quadruplets.
Example 1:
Input: nums = [1,0,-1,0,-2,2], target = 0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
Example 2:
Input: nums = [], target = 0
Output: []
Constraints:
0 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
Solution
two pointers
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int len = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> answer;
for(int i = 0; i < len-3; ++i) {
if(i && i < len-3 && nums[i] == nums[i-1]) continue;
for(int j = i+1; j < len-2; ++j) {
if(j > i+1 && j < len-2 && nums[j] == nums[j-1]) continue;
int begin = j+1, end = len-1, tar = target-nums[i]-nums[j];
while(begin < end) {
if(nums[begin]+nums[end] == tar) {
answer.push_back(vector<int>{nums[i], nums[j], nums[begin], nums[end]});
int curBegin = nums[begin];
int curEnd = nums[end];
while(begin < end && nums[begin] == curBegin) ++begin;
while(begin < end && nums[end] == curEnd) --end;
} else if (nums[begin]+nums[end] < tar) {
++begin;
} else {
--end;
}
}
}
}
return answer;
}
};
December LeetCoding Challenge 25
Description
Diagonal Traverse
Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
Example:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,4,7,5,3,6,8,9]
Explanation:
Note:
The total number of elements of the given matrix will not exceed 10,000.
Solution
nothing to say
class Solution {
int rows, cols;
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
if(matrix.empty() || matrix.front().empty()) return vector<int>();
rows = matrix.size(), cols = matrix.front().size();
vector<int> answer;
int row = 0, col = 0, dir = 1;
while(true) {
answer.push_back(matrix[row][col]);
if(row == rows-1 && col == cols-1) break;
if(row-dir >= 0 && row-dir < rows && col+dir >= 0 && col+dir < cols) {
row -= dir;
col += dir;
} else {
if(dir > 0) {
if(col+1 < cols) col += 1;
else row += 1;
} else {
if(row+1 < rows) row += 1;
else col += 1;
}
dir = -dir;
}
}
return answer;
}
};