while (loop-- > 0){ for (j = start; j < n - offset; j++){ result[start][j] = count++; } for (i = start; i < n - offset; i++){ result[i][j] = count++; }
for (inti=0; i < nums.length; i++){ maxDistance = Math.max(maxDistance, i + nums[i]); if (maxDistance >= nums.length - 1){ count++; break; }
if (i == curDistance){ curDistance = maxDistance; count++; } } return count++; } }
解法需要温习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { publicintjump(int[] nums) { intresult=0; intend=0; inttemp=0; for (inti=0; i <= end && end < nums.length - 1; i++){ temp = Math.max(temp, i + nums[i]); if (i == end) { end = temp; result++; } }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; backTracking(candidates, target, 0); return result; }
privatevoidbackTracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < candidates.length; i++){ target -= candidates[i]; path.add(candidates[i]); backTracking(candidates, target, i); path.removeLast(); target += candidates[i]; }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); boolean[] used; public List<List<Integer>> combinationSum2(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; used = newboolean[candidates.length]; Arrays.fill(used, false); Arrays.sort(candidates); backTracking(candidates, target, 0); return result; }
privatevoidbackTracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < candidates.length; i++){ if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) continue; used[i] = true; path.add(candidates[i]); target -= candidates[i]; backTracking(candidates, target, i + 1); target += candidates[i]; path.removeLast(); used[i] = false; } } }
classSolution { List<List<String>> result = newArrayList<>(); List<String> path = newArrayList<>();
public List<List<String>> partition(String s) { if (s == null || s.length() == 0) return result; backTracking(s, 0);
return result; }
privatevoidbackTracking(String s, int start){ if (start == s.length()){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < s.length(); i++){ if (isPalindrome(s, start, i)){ path.add(s.substring(start, i + 1)); backTracking(s, i + 1); path.removeLast(); } } }
privatebooleanisPalindrome(String s, int start, int end){ while (start <= end){ if (s.charAt(start++) != s.charAt(end--)) returnfalse; }
classSolution { List<String> result = newArrayList<>(); public List<String> restoreIpAddresses(String s) { if (s == null || s.length() == 0 || s.length() > 12) return result; backTracking(s, 0, 0); return result; }
privatevoidbackTracking(String s, int start, int pointsNum){ if (pointsNum == 3) { if (isValid(s, start, s.length() - 1)){ result.add(s); return; } }
for (inti= start; i < s.length(); i++){ if (isValid(s, start, i)){ s = s.substring(0, i + 1) + '.' + s.substring(i + 1); pointsNum++; backTracking(s, i + 2, pointsNum); pointsNum--; s = s.substring(0, i + 1) + s.substring(i + 2); } } } privatebooleanisValid(String s, int start, int end){ if (start > end) returnfalse;
classSolution { List<List<String>> result = newArrayList<>(); char[][] board; public List<List<String>> solveNQueens(int n) { board = newchar[n][n]; for (char[] i : board){ Arrays.fill(i, '.'); } backTracking(n, 0); return result; }
privatevoidbackTracking(int n, int row){ if (row == n){ result.add(board2List(board)); return; } for (inti=0; i < n; i++){ if (isValid(n, row, i)){ board[row][i] = 'Q'; backTracking(n, row + 1); board[row][i] = '.'; } } }
private List<String> board2List(char[][] board){ List<String> result = newArrayList<>(); for (char[] i : board){ result.add(String.copyValueOf(i)); }
return result; }
privatebooleanisValid(int n, int row, int col){ for (inti= row - 1; i >= 0; i--){ if (board[i][col] == 'Q') returnfalse; } for (inti= row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){ if (board[i][j] == 'Q') returnfalse; }
for (inti= row - 1, j = col + 1; i >= 0 && j < n; i--, j++){ if (board[i][j] == 'Q') returnfalse; }
privatebooleansolver(char[][] board){ for (inti=0; i < 9; i++){ for (intj=0; j < 9; j++){ if (board[i][j] != '.') continue; for (chark='1'; k <= '9'; k++){ if (isValid(board, i, j, k)){ board[i][j] = k; if (solver(board)) returntrue; board[i][j] = '.'; } }
returnfalse; } }
returntrue; }
privatebooleanisValid(char[][] board, int row, int col, char k){ for (inti=0; i < 9; i++){ if (board[i][col] == k) returnfalse; } for (inti=0; i < 9; i++){ if (board[row][i] == k) returnfalse; }
如果 count 小于0, 把coun归位 class Solution { public int maxSubArray(int[] nums) { if (nums.length == 1) return nums[0];
int sum = Integer.MIN_VALUE;
int count = 0;
for (int i = 0; i < nums.length; i++){
count += nums[i];
sum = Math.max(count, sum);
if (count <= 0){
count = 0;
}
}
return sum;
}
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; backtracking(candidates, target, 0); return result; }
privatevoidbacktracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); boolean[] used; public List<List<Integer>> combinationSum2(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; used = newboolean[candidates.length]; Arrays.sort(candidates); backtracking(candidates, target, 0); return result; }
privatevoidbacktracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < candidates.length; i++){ if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) continue; target -= candidates[i]; path.add(candidates[i]); used[i] = true; backtracking(candidates, target, i + 1); used[i] = false; path.removeLast(); target += candidates[i];
classSolution { List<List<String>> result = newArrayList<>(); List<String> path = newArrayList<>(); public List<List<String>> partition(String s) { if (s.length() == 0 || s == null) return result; backtracking(s, 0); return result; }
privatevoidbacktracking(String s, int start){ if (start == s.length()){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < s.length(); i++){ if (isPalindrome(s, start, i)){ path.add(s.substring(start, i + 1)); backtracking(s, i + 1); path.removeLast(); } } } privatebooleanisPalindrome(String s, int start, int end){ while (start<=end){ if (s.charAt(start) != s.charAt(end)) returnfalse; start++; end--; }
public List<String> restoreIpAddresses(String s) { if (s.length() == 0 || s == null || s.length() > 12) return result;
backtracking(s, 0, 0); return result; }
privatevoidbacktracking(String s, int start, int points){ if (points == 3){ if (isValid(s, start, s.length() - 1)){ result.add(newString(s)); return; } }
for (inti= start; i < s.length(); i++){ if (isValid(s, start, i)){ points++; s = s.substring(0, i + 1) + "." + s.substring(i + 1); backtracking(s, i + 2, points); points--; s = s.substring(0, i + 1) + s.substring(i + 2); } } }
privatebooleanisValid(String s, int start, int end){ if (start > end) returnfalse; if (s.charAt(start) - '0' == 0 && start != end) returnfalse; intnum=0;
for (inti= start; i <= end; i++){ if (s.charAt(i) - '0' > 9 || s.charAt(i) - '0' < 0) returnfalse; num = num * 10 + s.charAt(i) - '0'; if (num > 255) returnfalse; }
returntrue; } }
78 子集
注意result添加地方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> subsets(int[] nums) { backtracking(nums, 0); return result; }
privatevoidbacktracking(int[] nums, int start){ result.add(newArrayList(path)); for (inti= start; i < nums.length; i++){ path.add(nums[i]); backtracking(nums, i + 1); path.removeLast(); } } }
privatebooleansudoSolver(char[][] board){ for (inti=0; i < 9; i++){ for (intj=0; j < 9; j++){ if (board[i][j] != '.') continue;
for (chark='1'; k <= '9'; k++){ if (isValid(i, j, k, board)){ board[i][j] = k; if (sudoSolver(board)) returntrue; board[i][j] = '.'; } }
returnfalse; } }
returntrue; }
privatebooleanisValid(int row, int col, char val, char[][] board){ for (inti=0; i < 9; i++){ if (board[row][i] == val) returnfalse; } for (inti=0; i < 9; i++){ if (board[i][col] == val) returnfalse; }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combine(int n, int k) { backTracking(n, k ,1); return result; }
privatevoidbackTracking(int n, int k, int start){ if(path.size() == k){ result.add(newArrayList<>(path)); return; }
for(inti= start; i <= n - (k - path.size()) + 1; i++){ path.add(i); backTracking(n , k, i + 1); path.remove(path.size() - 1); } } }
classSolution { List<List<Integer>> result = newArrayList<>();
List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum3(int k, int n) { backTracking(k , n, 1); return result; }
privatevoidbackTracking(int k, int n , int start){ if (n < 0) return; if (n == 0 && path.size() == k){ result.add(newArrayList<>(path)); return; } for (inti= start; i <= 9 - (k - path.size()) + 1; i++){ path.add(i); n -= i; backTracking(k, n, i + 1); n += i; path.remove(path.size() - 1); } } }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length == 0) return result; Arrays.sort(candidates); backTracking(candidates, target, 0); return result; }
privatevoidbackTracking(int[] candidates, int target, int start){ if (target < 0) return; if (target == 0){ result.add(newArrayList<>(path)); return; }
classSolution { List<List<String>> result = newArrayList<>(); List<String> path = newArrayList<>(); public List<List<String>> partition(String s) { if (s == null || s.length() == 0) return result;
backTracking(s, 0); return result; }
privatevoidbackTracking(String s, int start){ if (start == s.length()){ result.add(newArrayList<>(path)); return; }
for (inti= start; i < s.length(); i++){ if (isPalindrome(s, start, i)){ path.add(s.substring(start, i + 1)); backTracking(s, i + 1); path.remove(path.size() - 1); } } }
privatebooleanisPalindrome(String s, int start, int end){ while (start <= end){ if (s.charAt(start) != s.charAt(end)) returnfalse; start++; end--; } returntrue; } }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates.length == 0) return result; backTracking(candidates, target, 0); return result; }
privatevoidbackTracking(int[] candidates, int target, int start){ if (target < 0){ return; } if (target == 0){ result.add(newArrayList<>(path)); return; }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combine(int n, int k) { getPath(n, k, 1);
return result; }
privatevoidgetPath(int n, int k, int start){ if (path.size() == k){ result.add(newArrayList<>(path)); return; }
for (inti= start; i <= n - (k - path.size()) + 1; i++){ path.add(i); getPath(n, k, i + 1); path.remove(path.size() - 1); } } }
class Solution { List<List<Integer>> result = new ArrayList<>(); List<Integer> path = new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { backtracking(n, k, 1); return result; }
private void backtracking(int n, int k, int start){ if (path.size() == k){ result.add(new ArrayList<>(path));
return; }
for (int i = start; i <= n - (k - path.size()) + 1; i++){ path.add(i); backtracking(n, k , i + 1); path.remove(path.size() - 1); } } }
classSolution { List<List<Integer>> result = newArrayList<>();
List<Integer> path = newArrayList<>(); public List<List<Integer>> combinationSum3(int k, int n) { backtracking(k, n, 1); return result; }
privatevoidbacktracking(int k, int n, int start){ if (n < 0){ return; } if (path.size() == k){ if (n == 0){ result.add(newArrayList<>(path)); return; } }
for (inti= start; i <= 9 - (k - path.size()) + 1; i++){ n -= i; path.add(i); backtracking(k, n, i + 1); n += i; path.remove(path.size() - 1); } } }
classSolution { List<List<Integer>> result = newArrayList<>(); List<Integer> path = newArrayList<>(); public List<List<Integer>> combine(int n, int k) { backtracking(n, k, 1);
return result; }
privatevoidbacktracking(int n, int k, int start){ if (path.size() == k){ result.add(newArrayList<>(path)); return; }
for (inti= start; i <= n - k + path.size() + 1; i++){ path.add(i); backtracking(n, k, i + 1); path.remove(path.size() - 1); } } }