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;
}
}