力扣算法学习day05-1
2022/1/25 12:37:18
本文主要是介绍力扣算法学习day05-1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 力扣算法学习day05-1
- 15-三数之和
- 题目
- 代码实现
力扣算法学习day05-1
15-三数之和
题目
代码实现
class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); // 将nums进行排序 Arrays.sort(nums); // 使用i为第一个指针,为定向指针,模拟了逐步右移的过程(内有去重),每次右移则会 // 通过left和right两个指针向中间移动寻找合适的值。nums.length - 2是长度考虑。 for(int i = 0;i < nums.length - 2;i++){ if(nums[0] > 0){// 排除全部大于0的情况 break; } //i去重,注意不能是由后向前判断,即不能是nums[i] == nums[i + 1] if(i > 0 && nums[i] == nums[i - 1]){ continue; } int left = i + 1;// 左指针 int right = nums.length - 1;// 右指针 while(right > left){// 相同或交叉过去了,就需要结束进入下一轮了。 // 由于[0,0,0]这种情况,所以去重应该放在先找到一个满足的后再去重。 int sum = nums[i] + nums[left] + nums[right]; if(sum < 0){ left++; } else if(sum > 0){ right--; } else {// 找到满足的了。 List<Integer> temp = new ArrayList<>(); temp.add(nums[i]); temp.add(nums[left]); temp.add(nums[right]); result.add(temp); // 去重 , right > left 是为了防止[-1,1,1,1,1]这种情况。 while(right > left && nums[left] == nums[left + 1]){ left++; } while(right > left && nums[right] == nums[right - 1]){ right--; } // 将两指针同时移动 left++; right--; } } } // 长度小于3的情况不会进入循环,直接输出空的List即可。 return result; } }
这篇关于力扣算法学习day05-1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现