task 01 数组—datawhale and 天池
例题分析
1. 两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
for (int i = 0 ; i < n - 1; ++ i)
for (int j = i + 1; j < n ;++ j)
{
if (nums[i] + nums[j] == target) return {i,j};
}
return {};
}
};
2. 最接近的三数之和
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int n = nums.size();
int ans = nums[0]+nums[1]+nums[2];
for (int i = 0 ; i < n - 2 ; ++ i)
for (int j = i + 1; j < n - 1 ; ++ j)
for (int k = j + 1; k < n ; ++ k)
{
int temp = nums[i] + nums[j] + nums[k];
if (abs(temp - target) < abs (ans - target)) ans = temp;
}
return ans;
}
};
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans = nums[0] + nums[1] + nums[2];
int n = nums.size();
for (int i = 0 ; i < n - 2 ; ++ i)
{
int start = i + 1,end = n - 1;
while (start < end)
{
int temp = nums[start] + nums[end] + nums[i];
if (abs(temp - target) < abs(ans - target)) ans = temp;
if (temp > target) --end;
else if (temp < target) ++start;
else return ans;
}
}
return ans;
}
};
课后习题
1. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int count = 0;
for (int i = 0 ; i < n ; ++ i )
{
if (nums[i] != val)
{
nums[count] = nums[i];
++ count;
}
}
return count;
}
};
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0 , right = nums.size();
while (left < right)
{
if (nums[left] == val) nums[left] = nums[--right];
else ++left;
}
return left;
}
};
2. 删除有序数组中的重复项
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if ( n == 0 ) return 0;
int count = 1;
int temp = nums[0];
for (int i = 1 ; i < n ; ++ i)
{
if (nums[i] != temp)
{
nums[count] =nums[i];
++ count;
temp = nums[i];
}
}
return count;
}
};
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if ( n == 0 ) return 0;
int fast = 1, slow = 1;
while (fast < n)
{
if (nums[fast] != nums[fast - 1])
{
nums[slow] = nums[fast];
++ slow;
}
++ fast;
}
return slow;
}
};
3. 三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
if (n < 3 || nums[0] > 0 || nums[n-1] < 0) return ans;
for (int i = 0 ; i < n - 2; ++ i)
{
if (i > 0 && nums[i] == nums[i - 1]) continue;
int start = i + 1, end = n - 1;
while (start < end)
{
int temp = nums[start] + nums[end] + nums[i];
if (temp == 0){
ans.push_back({nums[start],nums[end],nums[i]});
while (start < end && nums[start] == nums[start + 1]) ++ start;
while (start < end && nums[end] == nums[end - 1]) -- end;
++ start;
-- end;
}else if (temp > 0) --end;
else ++ start;
}
}
return ans;
}
};
总结
熟悉了数组与简单的双指针问题,希望再接再厉~