集合的所有子集&&没有重复项数字的所有排列&&链表中倒数最后k个结点

195 阅读1分钟

NC27 集合的所有子集

题目链接

1、解题思路

这个题目的难点在于去重。首先排序,然后在每层for循环的时候直接去重。

if (i > index && arr[i] == arr[index]) {
    continue;
}
2、代码
import java.util.*;

public class Solution {
    private void dfs(ArrayList<ArrayList<Integer>> lists, ArrayList<Integer> list, int index, int[] arr) {
        lists.add(new ArrayList<>(list));
        for (int i = index; i < arr.length; i++) {
            if (i > index && arr[i] == arr[index]) {
                continue;
            }
            list.add(arr[i]);
            dfs(lists, list, i + 1, arr);
            list.remove(list.size() - 1);
        }
    }

    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        if (S == null || S.length == 0) {
            return lists;
        }
        ArrayList<Integer> list = new ArrayList<>();
        Arrays.sort(S);
        dfs(lists, list, 0, S);
        return lists;
    }
}

NC43 没有重复项数字的所有排列

题目链接

1、解题思路

保证相同数字的绝对顺序不会改变,就类似于那个稳定排序一样。

2、代码
import java.util.*;

public class Solution {
    private void dfs(ArrayList<ArrayList<Integer>> lists, ArrayList<Integer> list, int[] arr, int[] vis) {
        if (list.size() == arr.length) {
            lists.add(new ArrayList<>(list));
        } else {
            for (int i = 0; i < arr.length; i++) {
                if (i != 0 && arr[i] == arr[i - 1] && vis[i - 1] == 1) {
                    continue;
                }
                if (vis[i] == 1) {
                    continue;
                }
                list.add(arr[i]);
                vis[i] = 1;
                dfs(lists, list, arr, vis);
                vis[i] = 0;
                list.remove(list.size() - 1);
            }
        }
    }

    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        int[] vis = new int[num.length];
        dfs(lists, list, num, vis);
        return lists;
    }
}

NC69 链表中倒数最后k个结点

题目链接

1、解题思路

普通模拟就行

2、代码
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    private int genLen(ListNode node) {
        ListNode temp = node;
        int ans = 0;
        while (temp != null) {
            temp = temp.next;
            ans = ans + 1;
        }
        return ans;
    }

    public ListNode FindKthToTail(ListNode pHead, int k) {
        int len = genLen(pHead);
        if (k > len) {
            return null;
        }
        for (int i = 0; i < len - k; i++) {
            pHead = pHead.next;
        }
        return pHead;
    }
}