今日leetCode 18. 四数之和

devtools/2024/11/13 10:26:14/

18. 四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 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]]

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

 题解:排序 + 双指针(引自代码随想录)

与今日 leetCode 15.三数之和-CSDN博客一个思路,均使用双指针法,不过就是在三数之和的基础上再套了一层循环。

细节注意:不可判断nums[k] > target 就返回,三数之和可以通过nums[i] > 0 就返回是因为0已经是确定的数了,四数之和这道题目target可以是任意值,比如,数组是[-4,-3,-2,-1],target是-10,不能因为-4 > -10而跳过。但是我们依旧可以去做减枝,逻辑变成nums[i] > target && (nums[i] >= 0 || target >= 0)就可以了。

三数之和的指针解法是一层for循环num[i]为确定值,依然是循环内有left和right 下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target 的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。


代码实现

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);List<List<Integer>> res = new ArrayList<>();for(int k = 0;k < nums.length;k++) {// 减枝if(nums[k] > target && nums[k] >= 0) {break;}// 对k进行去重if(k > 0 && nums[k] == nums[k - 1]) {continue;}for(int i = k + 1;i < nums.length;i++) {if(nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}if(i > k + 1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.length - 1;while(left < right) {long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];if(sum > target) {right--;}else if(sum < target) {left++;}else {res.add(Arrays.asList(nums[k],nums[i],nums[left],nums[right]));// 对left和right进行排重while(right > left && nums[right] == nums[right - 1]) right--;while(right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}}return res;}
}

http://www.ppmy.cn/devtools/114534.html

相关文章

leetcode hot100_part02_双指针

283.移动零 . - 力扣&#xff08;LeetCode&#xff09;&#xff1b;当前遍历位置不为0&#xff0c;左右指针一起前进&#xff0c;前进到为0的位置&#xff0c;左指针停下&#xff0c;右指针继续前进&#xff0c;右指针直到前进到第一个不为0的位置&#xff0c;然后交换&#x…

尚品汇-秒杀商品存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

计算机人工智能前沿进展-大语言模型方向-2024-09-13

计算机人工智能前沿进展-大语言模型方向-2024-09-13 1. OneEdit: A Neural-Symbolic Collaboratively Knowledge Editing System Authors: Ningyu Zhang, Zekun Xi, Yujie Luo, Peng Wang, Bozhong Tian, Yunzhi Yao, Jintian Zhang, Shumin Deng, Mengshu Sun, Lei Liang, Z…

【vue3】vue3.5

vue3.5是9.1发布的&#xff0c;还挺热乎的&#xff0c;赶快学习起来&#xff01;&#xff01;&#xff01; 组件属性结构解析赋值 组件属性结构解析赋值&#xff0c;高度提高开发体验&#xff0c;这个特性曾经在vue3.3提出过&#xff0c;然后3.4废弃&#xff0c;终于3.5稳定了。…

各种文件格式对应的ContentType,适用于文件接收与上传下载等场景...

Content-Type&#xff0c;即内容类型&#xff0c;是HTTP协议中的一个头部字段&#xff0c;用于指示发送到接收端&#xff08;通常是Web服务器或Web客户端&#xff0c;如浏览器&#xff09;的实体主体的媒体类型。它告诉浏览器或相关设备如何显示或处理加载的数据。Content-Type…

操作数组不越界的妙法C++

缘由https://bbs.csdn.net/topics/397090550 这个算法就不会越界&#xff0c;其关键在于-1之妙。string aa "123456789"; int a aa.size(), x 0;while (a)cout << aa[a-1] << endl,--a;while (x < a)cout << aa[x] << endl,x; void …

小明,谈谈你对Vue nextTick的理解

一、nextTick 的实现细节 在 Vue 中&#xff0c;nextTick 是一个重要的异步操作工具&#xff0c;用于在 DOM 更新完成后执行回调函数。其实现依赖于微任务机制&#xff0c;以确保操作在下一个“事件循环”中执行。以下是 nextTick 的具体实现过程&#xff1a; 任务队列&#xf…

神经网络 归一化层

为什么要进行网络归一化层&#xff1f; 神经网络训练过程中&#xff0c;当网络层数较多的时候&#xff0c;每一轮训练每个网络层的参数都会发生变化&#xff0c;那么网络层参数变化会有什么影响呢&#xff1f; 1. 向网络中输入相同分布的样本时&#xff0c;由于每一层网络的参…