其他分享
首页 > 其他分享> > 力扣---2020.9.8

力扣---2020.9.8

作者:互联网

77. 组合

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtrack(n,k,new ArrayList<>(),1);
        return list;
    }

    public void backtrack(int n,int k,List<Integer> track,int start){
        if(track.size()==k){
            list.add(new ArrayList(track));
            return;
        }
        for(int i = start;i <= n;i++){
            track.add(i);
            backtrack(n,k,track,i+1);
            track.remove(track.size()-1);
        }
    }
}
class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        for(int i = 0;i<k;i++){
            temp.add(0);
        }
        int i = 0;
        while (i >= 0) {
            temp.set(i, temp.get(i)+ 1); //当前数字加 1
            //当前数字大于 n,对应回溯法的 i == n + 1,然后回到上一层
            if (temp.get(i) > n) {
                i--;
            // 当前数字个数够了
            } else if (i == k - 1) { 
                ans.add(new ArrayList<>(temp));
            //进入更新下一个数字
            }else {
                i++;
                //把下一个数字置为上一个数字,类似于回溯法中的 start
                temp.set(i, temp.get(i-1));
            }
        }
        return ans;
    }
}

22. 括号生成

class Solution {
    List<String> res = new ArrayList<>();
    public List<String> generateParenthesis(int n) {
        dfs(n,n,"");
        return res;
    }
    
    public void dfs(int left,int right,String str){
        if(left==0&&right==0){
            res.add(str);
            return;
        }
        
        if (left > 0){
            dfs(left-1,right,str+"(");
        }
        if(right > left){
            dfs(left,right-1,str+")");
        }
    }
}
// 还没看懂代码和思路....
class Solution {
    ArrayList[] cache = new ArrayList[100];
    public List<String> generate(int n) {
        if (cache[n] != null) {
            return cache[n];
        }
        ArrayList<String> ans = new ArrayList();
        if (n == 0) {
            ans.add("");
        } else {
            for (int c = 0; c < n; ++c)
                for (String left: generate(c))
                    for (String right: generate(n - 1 - c))
                        ans.add("(" + left + ")" + right);
        }
        cache[n] = ans;
        return ans;
    }
    
    public List<String> generateParenthesis(int n) {
        return generate(n);
    }
}

2. 两数相加

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode curr =  dummy;
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0){
            int sum = 0;
            sum += l1==null ? 0:l1.val;
            sum += l2==null ? 0:l2.val;
            sum = sum + carry;
            carry = sum / 10;
            curr.next = new ListNode(sum%10);
            curr = curr.next;
            
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        return dummy.next;
    }
}

你知道的越多,你不知道的越多。

标签:---,return,2020.9,int,ArrayList,List,力扣,ans,new
来源: https://blog.csdn.net/qq_40722827/article/details/108476905