题目链接:383. 赎金信
题目思路:可以把四组数组两两相加,记录下前两组所有的{和:和的次数},存入字典中。然后将后两组每个数两两相加后,从字典中查询是否存在两数和的相反数,若有,count加一。
class Solution(object):
def fourSumCount(self, nums1, nums2, nums3, nums4):
first_two = dict()
for num1 in nums1:
for num2 in nums2:
first_two[num1 + num2] = first_two.get(num1 + num2, 0) + 1
count = 0
for num3 in nums3:
for num4 in nums4:
to_find = -(num3 + num4)
if to_find in first_two:
count += first_two.get(to_find)
return count
题目链接:383. 赎金信 - 力扣(LeetCode)
题目思路:与上次242. 有效的字母异位词 - 力扣(LeetCode)的思路一样。
class Solution(object):
def canConstruct(self, ransomNote, magazine):
record = [0]*26
for i in magazine:
record[ord(i)-ord('a')] += 1
for i in ransomNote:
if record[ord(i)-ord('a')] == 0:
return False
record[ord(i)-ord('a')] -= 1
return True
看解析,也可以直接用count,一行出答案。
class Solution(object):
def canConstruct(self, ransomNote, magazine):
return all(ransomNote.count(c) <= magazine.count(c) for c in set(ransomNote))
尝试使用C++
上学时有一门课需要用到C++,都是现学现用,基础不好,要多练练。
注意:C++要用“;”,需要定义变量类
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
if(ransomNote.size() > magazine.size()){
return false;
}
for (int i = 0; i < magazine.length(); i++){
record[magazine[i] - 'a'] ++;
}
for (int j = 0; j < ransomNote.length(); j++){
record[ransomNote[j] - 'a']--;
if (record[ransomNote[j] - 'a'] < 0){
return false;
}
}
return true;
}
};
题目链接:15. 三数之和 - 力扣(LeetCode)
题目大意:给定一个整数数组,返回所有和为0且不重复的三元组。
题目方法:双指针
如果i和前一个的数相同,就跳过。因为对于前一个值来说,left和right所找的范围涵盖了所有它后面的那些数,这包含了当前的数所要找的另外left和right的范围,所以上一个数已经把当前的数可能找到的结果涵盖了。
left:如果当前和left的后一位相同,则再往前,不然,由于i是固定的,如果left还是一样的,那么三元组也固定了,造成重复。
right:如果当前right和前一位相同,就再往前。
class Solution {
public:
vector> threeSum(vector& nums) {
vector> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++){
if (nums[i] > 0){
return result;}
if (i > 0 && nums[i] == nums[i-1]){continue;} //i跳出while循环
// 加1
int left = i + 1;
int right = nums.size() - 1;
while (left < right){
int sum = nums[i] + nums[left] + nums[right];
if ( sum < 0){
left++;
}
else if (sum > 0){
right--;
}
else{
result.push_back(vector{nums[i], nums[left], nums[right]});
while (left < right && nums[right] == nums[right - 1]){right--;}
while (left < right && nums[left] == nums[left + 1])
{left++;}
right--;
left++;
}
}
}
return result;
}
};
题目链接:18. 四数之和 - 力扣(LeetCode)
题目大意:给定一个整数数组,返回所有和为target且不重复的四元组。
class Solution {
public:
vector> fourSum(vector& nums, int target) {
vector> result;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); k++){
if (nums[k] > 0 && nums[k] > target) {break;}
// 统一通过最后的return返回
if (k > 0 && nums[k] == nums[k-1]){
continue;
}
for (int i = k + 1; i < nums.size(); i++){
if (nums[i] + nums[k] > 0 && nums[i] + nums[k] > target){
break;
}
if (i > k + 1 && nums[i] == nums[i-1]){
continue;}
int left = i + 1;
int right = nums.size() - 1;
while (left < right){
int sum = (long)nums[k] + nums[i] +nums[left] + nums[right];
if (sum < target) left++;
else if (sum > target) right--;
else{
result.push_back(vector{nums[k], nums[i], nums[left], nums[right]});
while (left < right && nums[left] == nums[left + 1])left++;
while(left