地方门户网站源码焊工培训心得体会
1.题目分析
2.算法原理
我们只需要利用双指针算法就可以计算排序之后的双数之和。排序用库中自带的sort函数。双指针算法利用下标访问。用int和下标访问代替指针更为直观。还需要考虑去重的操作。即left++之后,nums[left]==nums[left-1]还需要left++;
3.代码实操
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {vector<int>nums;size_t left=0;size_t right=price.size()-1;;while(left<right){if(price[left]+price[right]<target){left++;}else if(price[left]+price[right]>target){right--;}else{nums.push_back(price[left]);nums.push_back(price[right]);return nums;}}return nums;}
};
1.题目分析
2.算法原理
三数之和先固定第一个数字,然后target-固定的数字取相反数等于两数之和即可,需要注意去重操作和双数之和类似。
3.代码实操
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());
size_t left = 1;
int right = nums.size() - 1;
size_t cur = 0;
int count = 0;
vector<vector<int>>num;
vector<int>arr;
while (cur != nums.size() - 2)
{while (left < right){if (nums[left] + nums[right] == -nums[cur]){arr.push_back(nums[left]);arr.push_back(nums[right]);arr.push_back(nums[cur]);num.push_back(arr);arr.clear();count = 0;while (nums[left] == nums[left + 1]){if (left + 1 < nums.size() )left++;if (left + 1 == nums.size())break;}if (left + 1 < nums.size() )left++;elsebreak;while (nums[right] == nums[right - 1]){if (right - 1 > -1)right--;if (right - 1 == -1)break;}if (right - 1 > -1)right--;elsebreak;}else{if (nums[left] + nums[right] < -nums[cur]){if (left + 1 < nums.size() )left++;}else {if (right - 1 > -1)right--;}}}while (nums[cur] == nums[cur + 1]){if(cur+1<nums.size())cur++;if (cur == nums.size() - 2)break;}if (cur == nums.size() - 2)break;if (cur + 1 < nums.size())cur++;elsebreak;right = nums.size() - 1;left = cur + 1;
}
return num;}
};
1.题目分析
2.算法原理
四数之和用三数之和和双数之和。依次固定第一个数字第二个数字,然后用双数之和。它们的操作都是类似的。区别在于这一个题目用前一个题目的思路。为了避免数字相同超出边界要做边界判断。
注意:去重操作和不漏操作。
去重在于++之后看是否和前一个值相等,是则再次++否则结束循环。
不漏操作时找出双数之和和三数之和后还要继续该循环,找出所以得双数之和和三数之和的符合值。
3.代码实操
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<int>a;vector<vector<int>>num;if(nums.size()<4) return num;sort(nums.begin(), nums.end());int cur = 0;int pos = 1;int left = pos + 1;int right = nums.size() - 1;int sum = 0;while (cur < nums.size() - 3){long long int target1 = target - nums[cur];while (pos < nums.size() - 2){long long int target2 = target1 - nums[pos];while (left < right){sum = nums[left] + nums[right];if (sum < target2){left++;}if (sum > target2){right--;}if (sum == target2){a.push_back(nums[cur]);a.push_back(nums[pos]);a.push_back(nums[left]);a.push_back(nums[right]);num.push_back(a);a.clear();left++;right--;while (left < right&&nums[left - 1] == nums[left]){left++;}while (left < right&&nums[right + 1] == nums[right]){right--;}}}pos++;while (pos<nums.size()-2&&nums[pos - 1] == nums[pos]){pos++;if (pos >= nums.size() - 2)break;}if (pos >= nums.size() - 2)break;left = pos + 1;right = nums.size() - 1;}cur++;while (nums[cur - 1] == nums[cur]){cur++;if (cur >= nums.size() - 3)break;}if (cur >= nums.size() - 3)return num;pos = cur + 1;left = pos + 1;right = nums.size() - 1;}return num;
}
};