update whaifree redo demo更新了whaifree重做演示代码,新增了几个LeetCode题目(46、47、51、491)的解决方案,修改了40题的解法,包括回溯算法的实现和一些测试用例的输出方式。确保了代码的正确性和可读性。
This commit is contained in:
parent
567e7f1ff2
commit
b20f5f042f
@ -11,14 +11,9 @@ import java.util.*;
|
|||||||
|
|
||||||
public class LeetCode40 {
|
public class LeetCode40 {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
new LeetCode40().combinationSum2(new int[]{14,6,25,9,30,20,33,34,28,30,16,12,31,9,9,12,34,16,25,32,8,7,30,12,33,20,21,29,24,17,27,34,11,17,30,6,32,21,27,17,16,8,24,12,12,28,11,33,10,32,22,13,34,18,12}, 27).forEach(
|
new Solution().combinationSum2(new int[]{10, 1, 2, 7, 6, 1, 5}, 8).forEach(list -> {
|
||||||
list -> {
|
System.out.println(list);
|
||||||
list.forEach(
|
});
|
||||||
integer -> System.out.print(integer + " ")
|
|
||||||
);
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<List<Integer>> res = new ArrayList<>();
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
@ -53,4 +48,45 @@ public class LeetCode40 {
|
|||||||
nowSum -= candidates[i];
|
nowSum -= candidates[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static class Solution {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> path = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param candidates
|
||||||
|
* @param target
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
|
||||||
|
Arrays.sort(candidates);
|
||||||
|
backTracking(candidates, 0, target);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void backTracking(int[] candidates, int index, int need) {
|
||||||
|
if (need < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (need == 0) {
|
||||||
|
res.add(new ArrayList<>(path));
|
||||||
|
}
|
||||||
|
HashSet<Integer> set = new HashSet<>();
|
||||||
|
for (int i = index; i < candidates.length; i++) {
|
||||||
|
if (set.contains(candidates[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
set.add(candidates[i]);
|
||||||
|
path.add(candidates[i]);
|
||||||
|
backTracking(candidates, i + 1, need - candidates[i]);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240721;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/8/3 10:19
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode46 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {1,2,3};
|
||||||
|
Solution solution = new Solution();
|
||||||
|
solution.permute(nums).forEach(
|
||||||
|
System.out::println
|
||||||
|
);
|
||||||
|
}
|
||||||
|
class Solution {
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> path = new ArrayList<>();
|
||||||
|
public List<List<Integer>> permute(int[] nums) {
|
||||||
|
back(nums);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void back(int[] nums) {
|
||||||
|
if (path.size() >= nums.length) {
|
||||||
|
res.add(new ArrayList<>(path));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (path.contains(nums[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
path.add(nums[i]);
|
||||||
|
back(nums);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240721;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/8/3 13:15
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode47 {
|
||||||
|
@Test
|
||||||
|
public void test()
|
||||||
|
{
|
||||||
|
int[] nums = new int[]{1, 1, 2};
|
||||||
|
List<List<Integer>> x = new Solution1().permuteUnique(nums);
|
||||||
|
for (List<Integer> integers : x) {
|
||||||
|
System.out.println(integers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> path = new ArrayList<>();
|
||||||
|
public List<List<Integer>> permuteUnique(int[] nums) {
|
||||||
|
back(nums);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void back(int[] nums) {
|
||||||
|
if (path.size() >= nums.length) {
|
||||||
|
res.add(path.stream().mapToInt(value -> nums[value]).boxed().toList());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HashSet<Integer> set = new HashSet<>();
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (path.contains(i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (set.contains(nums[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
set.add(nums[i]);
|
||||||
|
path.add(i);
|
||||||
|
back(nums);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution1 {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> path = new ArrayList<>();
|
||||||
|
boolean[] used = null;
|
||||||
|
public List<List<Integer>> permuteUnique(int[] nums) {
|
||||||
|
used = new boolean[nums.length];
|
||||||
|
Arrays.sort(nums);
|
||||||
|
back(nums);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void back(int[] nums) {
|
||||||
|
if (path.size() >= nums.length) {
|
||||||
|
res.add(new ArrayList<>(path));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (i > 0 && nums[i - 1] == nums[i] && !used[i - 1]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (used[i]) { // 每条路径,同一个元素不会再使用
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
used[i] = true;
|
||||||
|
path.add(nums[i]);
|
||||||
|
back(nums);
|
||||||
|
used[i] = false;
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
146
src/main/java/cn/whaifree/redo/redo_all_240721/LeetCode491.java
Normal file
146
src/main/java/cn/whaifree/redo/redo_all_240721/LeetCode491.java
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240721;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/8/2 23:57
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode491 {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new Solution().findSubsequences(new int[]{4, 6, 7, 7}).forEach(System.out::println);
|
||||||
|
// new Solution1().subsetsWithDup(new int[]{1,2,2}).forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Solution {
|
||||||
|
List<List<Integer>> res;
|
||||||
|
List<Integer> path;
|
||||||
|
public List<List<Integer>> findSubsequences(int[] nums) {
|
||||||
|
res = new ArrayList<>();
|
||||||
|
path = new ArrayList<>();
|
||||||
|
back(0, nums);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 4677
|
||||||
|
* 4
|
||||||
|
* 6
|
||||||
|
* 7 7 这两个要去重,在这层用set
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param start
|
||||||
|
* @param nums
|
||||||
|
*/
|
||||||
|
public void back(int start, int[] nums) {
|
||||||
|
if (path.size() > 1) {
|
||||||
|
res.add(new ArrayList<>(path));
|
||||||
|
}
|
||||||
|
if (start >= nums.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HashSet<Integer> set = new HashSet<>();
|
||||||
|
for (int i = start; i < nums.length; i++) {
|
||||||
|
if (set.contains(nums[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (path.isEmpty() || path.get(path.size() - 1) <= nums[i]) {
|
||||||
|
path.add(nums[i]);
|
||||||
|
set.add(nums[i]);
|
||||||
|
back(i + 1, nums);
|
||||||
|
path.remove(path.size() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 错误,used只能用在相邻的判断
|
||||||
|
// static class Solution2 {
|
||||||
|
// List<List<Integer>> res;
|
||||||
|
// List<Integer> path;
|
||||||
|
// boolean[] used = null;
|
||||||
|
// public List<List<Integer>> findSubsequences(int[] nums) {
|
||||||
|
// res = new ArrayList<>();
|
||||||
|
// path = new ArrayList<>();
|
||||||
|
// used = new boolean[nums.length];
|
||||||
|
// back(0, nums);
|
||||||
|
// return res;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 4677
|
||||||
|
// * 4
|
||||||
|
// * 6
|
||||||
|
// * 7 7 这两个要去重,在这层用set
|
||||||
|
// *
|
||||||
|
// *
|
||||||
|
// *
|
||||||
|
// * @param start
|
||||||
|
// * @param nums
|
||||||
|
// */
|
||||||
|
// public void back(int start, int[] nums) {
|
||||||
|
// if (path.size() > 1) {
|
||||||
|
// res.add(new ArrayList<>(path));
|
||||||
|
// }
|
||||||
|
// if (start >= nums.length) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// for (int i = start; i < nums.length; i++) {
|
||||||
|
// if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// if (path.isEmpty() || path.get(path.size() - 1) <= nums[i]) {
|
||||||
|
// path.add(nums[i]);
|
||||||
|
// used[i] = true;
|
||||||
|
// back(i + 1, nums);
|
||||||
|
// used[i] = false;
|
||||||
|
// path.remove(path.size() - 1);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
static class Solution1 {
|
||||||
|
|
||||||
|
List<List<Integer>> res = new ArrayList<>();
|
||||||
|
List<Integer> temp = new ArrayList<>();
|
||||||
|
boolean[] used = null;
|
||||||
|
public List<List<Integer>> subsetsWithDup(int[] nums) {
|
||||||
|
Arrays.sort(nums);
|
||||||
|
used = new boolean[nums.length];
|
||||||
|
backTracking(nums, 0);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backTracking(int[] nums, int start) {
|
||||||
|
res.add(new ArrayList<>(temp));
|
||||||
|
if (start >= nums.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = start; i < nums.length ; i++) {
|
||||||
|
|
||||||
|
// u1 u2 相同,并且u1曾经被调用过,则不继续进行本次循环
|
||||||
|
// if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
temp.add(nums[i]);
|
||||||
|
used[i] = true;
|
||||||
|
backTracking(nums,i+1);
|
||||||
|
temp.remove(temp.size() - 1);
|
||||||
|
used[i] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_240721;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/8/3 13:34
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode51 {
|
||||||
|
@Test
|
||||||
|
public void test()
|
||||||
|
{
|
||||||
|
Solution solution = new Solution();
|
||||||
|
int n = 4;
|
||||||
|
System.out.println(solution.solveNQueens(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
char[][] map;
|
||||||
|
List<List<String>> res = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param col 确定下来,下次递归
|
||||||
|
* @param n
|
||||||
|
*/
|
||||||
|
public void back(int col, int n) {
|
||||||
|
if (col == n) {
|
||||||
|
List<String> path = new ArrayList<>();
|
||||||
|
for (char[] chars : map) {
|
||||||
|
String s = new String(chars);
|
||||||
|
path.add(s);
|
||||||
|
}
|
||||||
|
res.add(path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (isValid(col, i, n)) {
|
||||||
|
map[i][col] = 'Q';
|
||||||
|
back(col + 1, n);
|
||||||
|
map[i][col] = '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public List<List<String>> solveNQueens(int n) {
|
||||||
|
map = new char[n][n];
|
||||||
|
for (char[] chars : map) {
|
||||||
|
Arrays.fill(chars, '.');
|
||||||
|
}
|
||||||
|
back(0, n);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isValid(int col, int row, int n) {
|
||||||
|
|
||||||
|
// 往左查找
|
||||||
|
for (int i = 0; i < col; i++) {
|
||||||
|
if (map[row][i] == 'Q') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 左上45
|
||||||
|
for (int i = col, j = row; i >= 0 && j >= 0; i--, j--) {
|
||||||
|
if (map[j][i] == 'Q') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 左下45
|
||||||
|
for (int i = col, j = row; i >= 0 && j < n; i--, j++) {
|
||||||
|
if (map[j][i] == 'Q') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user