题目:454.四数相加II
文章链接:代码随想录
视频链接:LeetCode:454.四数相加||
题目链接:力扣题目链接
图释:
// 四数相加||
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {// 两两进行相加,放入map容器中unordered_map<int, int>map;// 把1和2的相加结果添加到map中,添加格式为<相加值,次数>for (int num1:nums1) {for (int num2:nums2) {// 由于是求组合数,并非排列数,所以不用考虑循序map[num1 + num2]++; // 直接创建一个pair,并对其中次数进行相加}}int result = 0;for (int num3 : nums3) {for (int num4 : nums4) {// 查询map中有无符合的值auto iter = map.find(0 - (num3 + num4));if (iter != map.end()) {result += iter->second;// 也可以直接result += map[0-(nums+num4)]用数组方式进行操作}}}return result;
}
题目:383. 赎金信
文章链接:代码随想录
题目链接:力扣题目链接
图释:
// 赎金信
bool canConstruct(string ransomNote, string magazine) {// 由于都是小写字母,所以最多只有26位,用数组也可以int Magezine[26] = {};for (int i = 0; i < magazine.size(); i++) {Magezine[magazine[i] - 'a']++;}for (int j = 0; j < ransomNote.size(); j++) {Magezine[ransomNote[j] - 'a']--;}for (int i = 0; i < 26; i++) {if (Magezine[i] < 0)return false;}return true;
}
题目:15. 三数之和
文章链接:代码随想录
视频链接:LeetCode:15.三数之和
题目链接:力扣题目链接
图释:
// 三数之和
vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>>result;// 指针解法// 1->2->3->4->5 先将数组进行排序sort(nums.begin(), nums.end());//找 a+b+c=0 a=nums[i] b=nums[left] c=nums[right]for (int i = 0; i < nums.size(); i++) {// 因为是从小到大排,当第一个数大于0时,后面的数怎么组合都不可能为0if (nums[i] > 0) {return result; //直接返回结果集}// a的去重if (i > 0 && nums[i]==nums[i-1]) {// 当数组为 -1 -1 1 2时,只取第一个-1,第二个-1就不取continue;}int left = i + 1;int right = nums.size() - 1;while (left < right) { // 两者相等的时候,元素重复了,所以返回// 总数大了,right要向后退if (nums[i] + nums[left] + nums[right] > 0)right--;else if (nums[i] + nums[left] + nums[right] < 0)left++;else {// 创建一个临时的vector数组,存放到result中result.push_back(vector<int>{nums[i], nums[left],nums[right]});// 对 b和c进行去重// 左边界查看下一个元素是否重复,left+1, 进行去重while (left < right && nums[left] == nums[left + 1])left++;// 右边界查看下一个元素是否重复,right-1进行去重while (left < right && nums[right] == nums[right - 1])right--;// 双指针收缩 right--;left++;}}}return result;
}
题目:18. 四数之和
文章链接:代码随想录
视频链接:LeetCode:18.四数之和
题目链接:力扣题目链接
图释:
// 四数之和
vector<vector<int>> fourSum(vector<int>& nums, int target) {//与三数之和一样,不过再加一层循环vector<vector<int>>result;// 排序sort(nums.begin(), nums.end());for (int k = 0; k < nums.size(); k++) {if (nums[k] >= 0 && nums[k] > target) {break;}// k去重if (k>0 && nums[k]==nums[k-1]) {continue;}for (int i = k + 1; i < nums.size(); i++) {if (nums[k] + nums[i] >= 0 && nums[k] + nums[i] > target) break;// i去重if (i>k+1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (left < right) {// 采用长整型,不然会爆限制if ((long)nums[k] + nums[i] + nums[left] + nums[right] > target)right--;else if ((long)nums[k] + nums[i] + nums[left] + nums[right] < target)left++;else {result.push_back(vector<int>{nums[k],nums[i], nums[left], nums[right]});// 对left和right去重while (left < right && nums[left] == nums[left + 1])left++;while (left < right && nums[right] == nums[right - 1])right--;// 指针收缩left++;right--;}}}}return result;
}