15. 三数之和

这篇博客讨论了一种经典的算法问题——寻找数组中和为0的三数组合。通过提供示例数组[-1, 0, 1, 2, -1, -4],博主展示了满足条件的三元组如[-1, 0, 1]和[-1, -1, 2]。解题策略主要依赖于回溯法,博主建议当遇到int[] nums和int target这样的问题时,可以考虑使用回溯算法。并区分了排列和组合问题,以及它们在元素重复情况下的处理方式。" 115252117,7355684,QtQuick 自定义ProgressBar实战,"['qt', 'qtquick', 'qml', 'progressbar']
摘要由CSDN通过智能技术生成

leetcode刷题

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

**解题思路:第一反应就是回溯法!!套模板~模板之前说过啦,需要的小伙伴可以去看之前的文章
个人总结:每当题目给出int[] nums和int target时,让你求出 List<List> 集合时,都可以考虑回溯算法!!
题型无非久2种,一个是排列问题,一个是组合问题。
排列:list中任意数字的改变顺序都是一个新的结果,与顺序有关。
组合:list中的元素相同,和顺序无关,就是组合问题。

然后每一种又分为2种,
一个是元素无重复;一个是元素有重复
(一个是元素只能使用一次;一个是元素可以无限使用)

先来看排列问题把:boolean[] visited~
1.全排列:元素无重复

  private void backtrack(int[] nums,List<Integer> list,boolean[] visited){
   
        if(list.size()==nums.length){
   
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i=0;i<nums.length;i++){
   
            if(visited[i]){
   //也就是当第一个为1时,第二层也可能为1,2,3。这一步的操作是去除了重复,如果已经访问了,就不在添加了。
                continue;
            }
            list.add(nums[i]);
            visited[i] = true;
            backtrack(nums,list,visited);
            list.remove(list.get(list.size()-1));
            visited[i] = false;           
        }
    }
}

2.全排列:元素有重复!!!必须排序Arrays.sort(nums)

class Solution {
   

    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
   
        //切记必须要先排序啊!!!!!!这样只有相邻的才可能相等,才可以判断去除!!!!!
        Arrays.sort(nums);
        List<Integer> list = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值