454.四数相加II

给你四个整数数组nums1、nums2、nums3和nums4 ,数组长度都是n ,请你计算有多少个元组(i, j, k, l)能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0示例1:
输入:nums1 = [1, 2], nums2 = [-2, -1], nums3 = [-1, 2], nums4 = [0, 2]
输出:2
解释:两个元组如下:
1.(0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2.(1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0示例2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1
class Solution:def fourSumCount(self, nums1: int, nums2: int, nums3: int, nums4: int) -> int:dict_num1 = {}for i in range(len(nums1)):for j in range(len(nums2)):tmp = nums1[i] + nums2[j]if tmp not in dict_num1:dict_num1[tmp] = [[i,j]]else:dict_num1[tmp].append([i,j])dict_num2 = {}for i in range(len(nums3)):for j in range(len(nums4)):tmp = nums3[i] + nums4[j]if tmp not in dict_num2:dict_num2[tmp] = [[i,j]]else:dict_num2[tmp].append([i,j])res = 0for i in dict_num1:for j in dict_num2:if i + j == 0:li = len(dict_num1[i])lj = len(dict_num2[j])tmp = li * ljres += tmpreturn resif __name__ == '__main__':nums1 = [1, 2]nums2 = [-2, -1]nums3 = [-1, 2]nums4 = [0, 2]tmp = Solution()res = tmp.fourSumCount(nums1,nums2,nums3,nums4)print(res)
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> map1;for(int i = 0; i < nums1.size(); i++){for(int j = 0; j < nums2.size(); j++){int tmp = nums1[i]+nums2[j];map1[tmp]++;}}int res = 0;for(int i = 0; i < nums3.size(); i++){for(int j = 0; j < nums4.size(); j++){int tmp = nums3[i] + nums4[j];if(map1.find(0-tmp) != map1.end()){res += map1[0-tmp];}}}return res;}
};

看了一下解法,因为只需要求计数,所以可以直接count计数,这样可以少循环一次。

383.赎金信

给你两个字符串:ransomNote和magazine ,判断ransomNote能不能由magazine里面的字符构成。
如果可以,返回true ;否则返回false 。
magazine中的每个字符只能在ransomNote中使用一次。示例1:
输入:ransomNote = "a", magazine = "b"
输出:false示例2:
输入:ransomNote = "aa", magazine = "ab"
输出:false示例3:
输入:ransomNote = "aa", magazine = "aab"
输出:true

class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:dic = {}for i in ransomNote:if i not in dic:dic[i] = 1else:dic[i] += 1dic_mag = {}for j in magazine:if j not in dic_mag:dic_mag[j] = 1else:dic_mag[j] += 1for k, v in dic.items():tmp = dic_mag.get(k)if tmp is None or v > tmp:return Falsereturn Trueif __name__ == '__main__':ransomNote = "aa"magazine = "aab"tmp = Solution()res = tmp.canConstruct(ransomNote,magazine)print(res)
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int alpha[26] = {0};for(char a : magazine){alpha[a - 'a']++;}for(char b: ransomNote){alpha[b - 'a']--;if(alpha[b - 'a'] < 0){return false;}}return true;}
};

看了一下随想录,发现python有四种解法, 麻了

重写发现C++的写法很有意思

15.三数之和

给你一个整数数组nums ,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != j、i != k且
j != k ,同时还满足nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为0且不重复的三元组。
注意:答案中不可以包含重复的三元组。示例1:
输入:nums = [-1, 0, 1, 2, -1, -4]
输出:[[-1, -1, 2], [-1, 0, 1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是[-1, 0, 1]和[-1, -1, 2] 。
注意,输出的顺序和三元组的顺序并不重要。示例2:
输入:nums = [0, 1, 1]
输出:[]
解释:唯一可能的三元组和不为0 。示例3:
输入:nums = [0, 0, 0]
输出:[[0, 0, 0]]解释:唯一可能的三元组和为0

class Solution:def threeSum(self, nums):long = len(nums)res = []nums.sort()for i in range(long):if i == long - 2:breakleft = i + 1right = long - 1while left < right:if nums[i] + nums[left] + nums[right] > 0:right -= 1elif nums[i] + nums[left] + nums[right] < 0:left += 1else:tmp = [nums[i], nums[left], nums[right]]tmp.sort()if tmp not in res:res.append(tmp)left += 1return resif __name__ == '__main__':nums = [-1, 0, 1, 2, -1, -4]nums = [0, 1, 1]nums = [0, 0, 0,0]nums = [-2, 0, 1, 1, 2]tmp = Solution()res = tmp.threeSum(nums)print(res)
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(),nums.end());int cnt = nums.size();for(int i = 0; i < cnt; i++){int start = i + 1;int end = cnt - 1;if(nums[i] > 0){return res;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}while(start < end){int sum = nums[i] + nums[start] + nums[end];if(sum == 0){vector<int> tmp;tmp.push_back(nums[i]);tmp.push_back(nums[start]);tmp.push_back(nums[end]);res.push_back(tmp);                    //[-2,0,0,2,2]这个示例指引去重while(end > start and nums[end] == nums[end-1]){end--;}while(end > start and nums[start] == nums[start+1]){start++;}start++;end--;                    }else if(sum > 0){end--;}else{start++;}}}return res;}
};

18. 四数之和

给你一个由n个整数组成的数组nums ,和一个目标值target 。请你找出并返回满足下述全部条件且不重复的四元
组[nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c和d互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按任意顺序返回答案 。示例1:
输入:nums = [1, 0, -1, 0, -2, 2], target = 0
输出:[[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]]示例2:
输入:nums = [2, 2, 2, 2, 2], target = 8
输出:[[2, 2, 2, 2]]
class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()n = len(nums)res = []for i in range(n):if i > 0 and nums[i] == nums[i - 1]: continuefor k in range(i+1, n):if k > i + 1 and nums[k] == nums[k-1]: continuep = k + 1q = n - 1while p < q:if nums[i] + nums[k] + nums[p] + nums[q] > target: q -= 1elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1else:res.append([nums[i], nums[k], nums[p], nums[q]])while p < q and nums[p] == nums[p + 1]: p += 1while p < q and nums[q] == nums[q - 1]: q -= 1p += 1q -= 1return res

第四题需要再看看,压力好大啊,这个节奏真的快

感觉现在每天睡眠质量严重不足啊

代码随想录算法训练营第四期第六天| 454.四数相加II、383.赎金信、15.三数之和、18. 四数之和相关推荐

  1. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

  2. 代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和

    一.454.四数相加II 力扣 思路:第一眼还没反应过来,真是缺练.在四个数组中分别寻找,可以先把前两个数组的和先存入map中,再计算后两个数组元素的和,看一下相反数在map中出现没有,出现过就res ...

  3. 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和

    一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...

  4. 代码随想录算法训练营第07天 | LeetCode 454.四数相加2,383. 赎金信,15. 三数之和,18. 四数之和,总结

    LeetCode [454. 四数相加 II] 题目:给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足 ...

  5. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  6. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  7. 代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。

    代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和. 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加I ...

  8. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  9. _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    _42LeetCode代码随想录算法训练营第四十二天-动态规划 | 121.买卖股票的最佳时机.122.买卖股票的最佳时机II 题目列表 121.买卖股票的最佳时机 122.买卖股票的最佳时机II 1 ...

  10. 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30

    代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...

最新文章

  1. 加州大学研发全柔性汗液传感器,实时监控人体健康
  2. 最最最最终极办法!解决Idea乱码问题
  3. 软通动力月薪8K面试题解析
  4. Redis:复制,第2部分——主从复制和Redis哨兵
  5. 吴恩达机器学习作业Python实现(七):K-means和PCA主成分分析
  6. 用Python解压tgz文件
  7. [源码和报告分享] 基于VC++的MFC类库实现的通讯录管理系统
  8. bos物流项目面试问题汇总
  9. php创蓝253四要素认证_PHP调用创蓝253国际短信验证码
  10. IMS:InputChannel通过socket发送Input给App
  11. 在Windows x64中加载驱动
  12. linux系统能做什么的,Linux系统适合日常使用吗?普通人学Linux能干什么
  13. 深度学习+语音,基础普及篇笔记(一)
  14. html+php内联执行JavaScript是报错
  15. java模拟器ios版安装失败,iOS 在模拟器上安装 Debug 调试包(.app)
  16. Dovecot的简单维护操作命令
  17. mysql意见反馈表设计_山西省住房和城乡建设厅 关于开展2021年度山西省建设工程企业信用评价工作的通知(第209号)...
  18. 用 Python 分析各国人口性别比例
  19. OSCP证书考试总结与终身学习 - 带你走上 OSCE3
  20. js中唤醒弹框的3种方式

热门文章

  1. app 打开支付宝扫码付款(当面付)
  2. 【高并发服务器】send、sendto以及recv、recvfrom区别小结
  3. Windows10 Atom安装和运行Python的使用教程(详细)
  4. TensorFlow中常见的CallBack
  5. 甘肃省计算机二级考试培训,甘肃省2017年计算机二级考试网上报名须知及流程...
  6. 小艺人黄鑫洋受邀参加巴黎时装周儿童单元武汉站
  7. mysql中的Innodb_buffer_pool
  8. 微信公众号对接后台开发的一些问题总结
  9. Oracle中的排序和排序函数的使用
  10. 在服务器网站上做跳转页面跳转页面,服务器怎么设置跳转页面跳转页面