package leetcode;
import leetcode.entity.Entry;
import leetcode.entity.ListNode;
import leetcode.entity.Node;
import leetcode.entity.TreeNode;
import java.util.*;
class Solution {
int result = 0;
/*
* @description: 1.两æ°ä¹å,仿°ç»ä¸æ¾åºä¸¤ä¸ªæ°ä½¿å
¶å为target
* @param: nums:intæ°ç»,target:ç®æ å¼
* @return: int[]:æ°ç»ä¸æ
*/
public int[] twoSum(int[] nums, int target) {
//key:å¼ value:æ°ç»ä¸æ
HashMap numberIndex = new HashMap();
int[] result = new int[2];
for (int i = 0, l = nums.length; i < l; i++) {
//夿ä¸å½åå¼å为targetç弿¯å¦åå¨
int index = numberIndex.getOrDefault(target - nums[i], -1);
if (index != -1) {
result[0] = index;
result[1] = i;
break;
}
numberIndex.put(nums[i], i);
}
return result;
}
/*
* @description: 2.两æ°ç¸å ,å°ä¸¤ä¸ªé¾è¡¨æ¯ä¸ªç»ç¹ç¸å
* @param: l1,l2:é空é¾è¡¨
* @return: ListNode:ç¸å åçç»æé¾è¡¨
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//è®°å½åå§nodeçå°å,ç¨æ¥return
ListNode head = new ListNode(0);
//游æ
ListNode cursor = head;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int val1 = 0, val2 = 0;
if (l1 != null) {
val1 = l1.val;
l1 = l1.next;
}
if (l2 != null) {
val2 = l2.val;
l2 = l2.next;
}
int result = val1 + val2 + carry;
carry = result / 10;
cursor.next = new ListNode(result % 10);
cursor = cursor.next;
}
return head.next;
}
/*
* @description: 3.æ éå¤çæé¿å串
* @param: s:å符串
* @return: æ éå¤å符æé¿çå串çé¿åº¦
*/
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
Map charIndex = new HashMap<>();
for (int i = 0, j = 0, l = s.length(); j < l; j++) {
i = Math.max(charIndex.getOrDefault(s.charAt(j), -1), i);
maxLength = Math.max(maxLength, j - i + 1);
charIndex.put(s.charAt(j), j + 1);
}
return maxLength;
}
/*
* @description: 4.寻æ¾ä¸¤ä¸ªæ£åºæ°ç»çä¸ä½æ°,æ¶é´å¤æåº¦O(log(m + n))
* @param: nums1,nums2:æåºintæ°ç»
* @return: double:ä¸ä½æ°
*/
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length = nums1.length + nums2.length;
//奿°æ
åµ,åä¸é´çä¸ä¸ªæ°å³å¯
if ((length & 1) == 1) {
return getTopK(nums1, 0, nums2, 0, length / 2 + 1) / 1.0;
}
//å¶æ°æ
åµ,åä¸é´2使°æ±å¹³åå¼
return (getTopK(nums1, 0, nums2, 0, length / 2) + getTopK(nums1, 0, nums2, 0, length / 2 + 1)) / 2.0;
}
/*
* @description: è·å两个æ°ç»ä¸ç¬¬kå¤§çæ°
* @param: num1,num2为 intæ°ç»,index1为num1èµ·å§ä¸æ ,index2为num2èµ·å§ä¸æ ,k为第k个
*/
private int getTopK(int[] nums1, int index1, int[] nums2, int index2, int k) {
if (index1 >= nums1.length) {
return nums2[index2 + k - 1];
}
if (index2 >= nums2.length) {
return nums1[index1 + k - 1];
}
if (k == 1) {
return Math.min(nums1[index1], nums2[index2]);
} else {
int tmpK = k / 2 - 1;
int position1 = Math.min((index1 + tmpK), nums1.length - 1);
int position2 = Math.min((index2 + tmpK), nums2.length - 1);
if (nums1[position1] >= nums2[position2]) {
position2 = position2 + 1;
k = k - (position2 - index2);
return getTopK(nums1, index1, nums2, position2, k);
} else {
position1 = position1 + 1;
k = k - (position1 - index1);
return getTopK(nums1, position1, nums2, index2, k);
}
}
}
/*
* @description: 5.æé¿åæå串,åææ£åè¾åºä¸æ ·é½å符串,ä¾å¦aba
* @param: s:å符串
* @return: String:æé¿çåæå串
*/
public String longestPalindrome(String s) {
if (s == null || s.length() == 1) {
return s;
}
int n = s.length();
//dp[i][j]å³ä¸ºs(i,j)æ¯å¦ä¸ºåæå串
boolean[][] dp = new boolean[n][n];
int start = 0;
int end = 0;
//æå¤å±ä¸ºå符串é¿åº¦
for (int l = 0; l < n; l++) {
for (int i = 0; i + l < n; i++) {
int j = i + l;
if (l == 0) {
dp[i][j] = true;
} else if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = l == 1 || dp[i + 1][j - 1];
}
if (dp[i][j] && l + 1 > (end - start)) {
start = i;
end = i + 1 + l;
}
}
}
return s.substring(start, end);
}
/*
* @description: 6.Zå形忢,å°ä¸ä¸ªç»å®åç¬¦ä¸²æ ¹æ®ç»å®çè¡æ°,以ä»ä¸å¾ä¸ãä»å·¦å°å³è¿è¡ Z åå½¢æåã
* @param: s:å符串,numRows:è¡æ°
* @return: String:Z忢åçå符串
*/
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
StringBuilder[] result = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
result[i] = new StringBuilder();
}
int count = 0;
boolean addFlag = true;
for (int i = 0, length = s.length(); i < length; i++) {
result[count].append(s.charAt(i));
if (addFlag) count++;
else count--;
if (count == numRows) {
addFlag = !addFlag;
count = count - 2;
}
if (count == -1) {
addFlag = !addFlag;
count = count + 2;
}
}
for (int i = 1; i < numRows; i++) {
result[0].append(result[i]);
}
return result[0].toString();
}
/*
* @description: 7.æ´æ°å转,å¦123å转321
* @param: x:æ´æ°
* @return: int:å转åçæ´æ°
*/
public int reverse(int x) {
int result = 0;
int tmpResult = 0;
int bit;
while (x != 0) {
bit = x % 10;
x = x / 10;
tmpResult = tmpResult * 10 + bit;
if (result != 0 && tmpResult / result < 10)
return 0;
result = tmpResult;
}
return result;
}
/*
* @description: 8.åç¬¦ä¸²è½¬æ¢æ´æ° (atoi)
* @param: str:å符串,å
许å¼å¤´ä¸ºç©ºæ ¼,å¯è½å
å«å
¶ä»å符
* @return: int:å符串转æ¢åçæ´æ°,妿è¶
è¿32æç¬¦å·æ´æ°çæå¼,å°±è¿åæå¼
*/
public int myAtoi(String str) {
int result = 0;
int tmpResult = 0;
int invalidResult = 0;
int positive = 1;
int start = 0;
int l = str.length();
//é¦å
å»é¤ç©ºæ ¼
for (; start < l; start++) {
if (str.charAt(start) != ' ')
break;
}
if (start == l) {
return invalidResult;
}
//夿é¦ä½æ¯ä¸æ¯ç¬¦å·
int firstChar = str.charAt(start);
if (firstChar == '+') {
start++;
positive = 1;
} else if (firstChar == '-') {
start++;
positive = -1;
} else if (firstChar < '0' || firstChar > '9') {
return invalidResult;
}
for (; start < l; start++) {
char c = str.charAt(start);
//ææå符串
if (c >= '0' && c <= '9') {
tmpResult = tmpResult * 10 + (c - 48);//asciiç
//æº¢åºæ
åµ
if (result != 0 && tmpResult / result < 10) {
if (positive == 1) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
}
result = tmpResult;
} else {
//æ æå符串
break;
}
}
return positive * result;
}
/*
* @description: 9.åææ°,夿ä¸ä¸ªæ°æ¯å¦ä¸ºåææ°(å符串形å¼ä¸)
* @param: x:æ´æ°
* @return: boolean:æ¯å¦ä¸ºåææ°
*/
public boolean isPalindrome(int x) {
if (x == 0) {
return true;
}
//è´æ°ä¸å¯è½ä¸ºåææ°
if (x < 0) {
return false;
}
//æåä¸ä½ä¸è½æ¯0,ä¾å¦10,100ä¸å¯è½æ¯åææ°
if (x % 10 == 0) {
return false;
}
int bit;
int result = 0;
while (x > 0) {
bit = x % 10;
result = result * 10 + bit;
if (result > x)
return false;
if (result == x)
return true;
x = x / 10;
if (result == x)
return true;
}
return true;
}
/*
* @description: 10.æ£å表达å¼å¹é
* @param: så符串,pæ£å表达å¼,
* s å¯è½ä¸ºç©º,ä¸åªå
å«ä» a-z çå°å忝ã
* p å¯è½ä¸ºç©º,ä¸åªå
å«ä» a-z çå°å忝,以åå符 . å *ã
* '.' å¹é
ä»»æå个å符
* '*' å¹é
é¶ä¸ªæå¤ä¸ªåé¢çé£ä¸ä¸ªå
ç´
* @return: trueå¹é
,falseä¸å¹é
*/
public boolean isMatch(String s, String p) {
if (p.isEmpty()) return s.isEmpty();
boolean firstCharMatch = (!s.isEmpty() &&
(p.charAt(0) == s.charAt(0) || p.charAt(0) == '.'));
//åå¨*æ¶
if (p.length() >= 2 && p.charAt(1) == '*') {
//ä¸¤ç§æ
åµ
//1 x*å¹é
空å符串
//2 x*å¹é
ä¸ä¸ªå符串
return (isMatch(s, p.substring(2)) ||
(firstCharMatch && isMatch(s.substring(1), p)));
} else {
//ä¸åå¨*æ¶
return firstCharMatch && isMatch(s.substring(1), p.substring(1));
}
}
/*
* @description: 11.çæå¤æ°´ç容å¨
* @param: height:intæ°ç»,height[i]代表é«åº¦
* @return: int:æå¤§çé¢ç§¯
*/
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
//åå§é¢ç§¯
int max = Math.min(height[left], height[right]) * (right - left);
while (left < right) {
if (height[left] < height[right]) {
left++;
} else {
right--;
}
int tmpArea = Math.min(height[left], height[right]) * (right - left);
max = Math.max(max, tmpArea);
}
return max;
}
/*
* @description: 12.æ´æ°è½¬ç½é©¬æ°å
* @param: numæ´æ°,å¨ 1 å° 3999 çèå´å
* @return: 对åºçç½é©¬å符
* å符 æ°å¼
* å符 æ°å¼
* I 1
* V 5
* X 10
* L 50
* C 100
* D 500
* M 1000
*/
public String intToRoman(int num) {
String[] thousands = new String[]{"", "M", "MM", "MMM"};
//0,100,...,900
String[] hundreds = new String[]{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
//0,10,...,90
String[] tens = new String[]{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
//0,1,...,9
String[] ones = new String[]{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
//åä½
int thousand = num / 1000;
int hundred = num % 1000 / 100;
int ten = num % 100 / 10;
int one = num % 10;
String result =
thousands[thousand] +
hundreds[hundred] +
tens[ten] +
ones[one];
return result;
}
/*
* @description: 13.ç½é©¬æ°åè½¬æ´æ°
* @param: s:ç½é©¬æ°åå符串,å¨1å°3999çèå´å
* @return: int:s对åºçæ°å
*/
public int romanToInt(String s) {
Map romanMap = initMap();
int result = 0;
int pre = 0;
for (int i = s.length() - 1; i >= 0; i--) {
int num = romanMap.get(s.charAt(i));
if (num >= pre) {
result += num;
} else {
result -= num;
}
pre = num;
}
return result;
}
/*
* @description: åå§åmap
*/
private Map initMap() {
Map romanMap = new HashMap<>();
romanMap.put('I', 1);
romanMap.put('V', 5);
romanMap.put('X', 10);
romanMap.put('L', 50);
romanMap.put('C', 100);
romanMap.put('D', 500);
romanMap.put('M', 1000);
return romanMap;
}
/*
* @description: 14.æé¿å
Œ
񆇬
* @param: strs:å符串æ°ç»
* @return: String:ææå符串æé¿å
Œ
񆇬
*/
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
//æ¾åºå符串æçé¿åº¦
int minLength = Integer.MAX_VALUE;
for (String str : strs) {
minLength = Math.min(minLength, str.length());
}
for (int i = 0; i < minLength; i++) {
char c = strs[0].charAt(i);
for (int j = 1, l = strs.length; j < l; j++) {
if (strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0].substring(0, minLength);
}
/*
* @description: 15.䏿°ä¹å
* @param: nums:intæ°ç»
* @return: List>:ææ[a,b,c]使å¾a+b+c=0ä¸a,b,cä¸éå¤
*/
public List> threeSum(int[] nums) {
//䏿°ä¹åå¯ä»¥è½¬å为两æ°åä¹å,ä¾å¦[-1, 0, 1, 2, -1, -4]åªéè¦ä¾æ¬¡æ¾å°ä¸¤ä¸ªå为[1,0,-1,-2,1,4]å³å¯
List> result = new ArrayList<>();
//对æ°ç»è¿è¡æåº
Arrays.sort(nums);
int length = nums.length;
for (int i = 0; i < length; i++) {
//è¥aå·²ç»å¤§äº0,ç±äºæåºè¿b,cè¯å®å¤§äº0
if (nums[i] > 0) {
break;
}
//ç¸åçaç´æ¥è·³è¿
if (i > 0 && (nums[i] == nums[i - 1])) {
continue;
}
int l = i + 1, r = length - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
//满足æ¡ä»¶
if (sum == 0) {
List list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[l]);
list.add(nums[r]);
result.add(list);
while (l < r && (nums[l + 1] == nums[l])) l++;
while (l < r && (nums[r - 1] == nums[r])) r--;
l++;
r--;
}
//å 大l
if (sum < 0) {
l++;
}
//åå°r
if (sum > 0) {
r--;
}
}
}
return result;
}
/*
* @description: 使ç¨å溯æ³è§£å³,æ¶é´å¤æåº¦å¤ªé«,åºè¯¥ä¼å
使ç¨åæé
*/
public List> threeSum2(int[] nums) {
List> result = new ArrayList<>();
if (nums.length < 3) {
return result;
}
Arrays.sort(nums);
threeSum2(nums, 0, 0, new ArrayList<>(3), result);
return result;
}
public void threeSum2(int[] nums, int start, int sum, List current, List> result) {
if (current.size() == 3) {
if (sum == 0) {
result.add(new ArrayList<>(current));
}
return;
}
for (int i = start, l = nums.length; i < l; i++) {
//åªæ
//1.è¥a>0,båcé½å¤§äº0,ä¸åå¨a+b+c=0
if (current.isEmpty() && nums[i] > 0)
break;
//1.è¥a+b>0,c大äº0,ä¸åå¨a+b+c=0
if (current.size() == 1 && (sum + nums[i]) > 0)
break;
//å»é
if (i > start && nums[i] == nums[i - 1])
continue;
current.add(nums[i]);
threeSum2(nums, i + 1, sum + nums[i], current, result);
current.remove(current.size() - 1);
}
}
/*
* @description: 16.ææ¥è¿ç䏿°ä¹å
* @param: nums:æ°ç»,target:ç®æ å¼
* @return: int:ææ¥è¿çtargetç䏿°ä¹å
*/
public int threeSumClosest(int[] nums, int target) {
//æåº
Arrays.sort(nums);
int length = nums.length;
int result = Integer.MAX_VALUE;
int minGap = Integer.MAX_VALUE;
for (int i = 0; i < length; i++) {
int l = i + 1, r = length - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
//ç¸çæ¶ææ¥è¿,ç´æ¥è¿å
if (sum == target) {
return target;
}
if (sum > target) {
r--;
}
if (sum < target) {
l++;
}
int gap = Math.abs(sum - target);
if (gap < minGap) {
result = sum;
minGap = gap;
}
}
}
return result;
}
/*
* @description: 17.çµè¯å·ç ç忝ç»å
* @param: digits:2-9ç»æçå符串
* @return: List:ä¹ç©ºæ ¼ææå符ç»å
* @example: digits为23,è¿å2对åºç"abc"å3对åº"def"çææå符ç»å:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
*/
public List letterCombinations(String digits) {
List result = new ArrayList<>();
List> letterList = getList();
for (int i = 0, l = digits.length(); i < l; i++) {
List charList = letterList.get(digits.charAt(i) - '0');
result = multiply(result, charList);
}
return result;
}
/*
* @description: å符串æ°ç»è½¬List
*/
private List> getList() {
//0-9对åºçä¹å®«æ ¼
String[] letters = {
"", "", "abc",
"def", "ghi", "jkl",
"mno", "pqrs", "tuv",
"wxyz"
};
List> letterList = new ArrayList(letters.length);
for (String letter : letters) {
List charList = new ArrayList<>();
for (int j = 0, dl = letter.length(); j < dl; j++) {
charList.add(letter.charAt(j) + "");
}
letterList.add(charList);
}
return letterList;
}
/*
* @description: ç¬å¡å°ç§¯
*/
private List multiply(List l1, List l2) {
if (l1.isEmpty() || l2.isEmpty()) {
return l1.isEmpty() ? l2 : l1;
}
List result = new ArrayList<>();
for (int i = 0; i < l1.size(); i++)
for (int j = 0; j < l2.size(); j++) {
result.add(l1.get(i) + l2.get(j));
}
return result;
}
/*
* @description: 18.åæ°ä¹å
* @param: nums:æ°ç»,target:ç®æ å¼
* @return: List>:ææ[a,b,c,d]使å¾a+b+c=targetä¸a,b,c,dä¸éå¤
*/
public List> fourSum(int[] nums, int target) {
List> result = new ArrayList<>();
//对æ°ç»è¿è¡æåº
Arrays.sort(nums);
int length = nums.length;
for (int i = 0; i < length - 1; i++) {
if (nums[i] > target) {
break;
}
if (i > 0 && (nums[i] == nums[i - 1])) {
continue;
}
for (int j = i + 1; j < length; j++) {
if (nums[i] + nums[j] > target) {
break;
}
if (j > i + 1 && (nums[j] == nums[j - 1])) {
continue;
}
int l = j + 1, r = length - 1;
while (l < r) {
int sum = nums[i] + nums[j] + nums[l] + nums[r];
if (sum == target) {
List list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[l]);
list.add(nums[r]);
result.add(list);
while (l < r && (nums[l + 1] == nums[l])) l++;
while (l < r && (nums[r - 1] == nums[r])) r--;
l++;
r--;
}
//å 大l
if ((target - sum) > 0) {
l++;
}
//åå°r
if ((target - sum) < 0) {
r--;
}
}
}
}
return result;
}
/*
* @description: 19.å é¤é¾è¡¨çåæ°ç¬¬N个èç¹
* @param: head:é¾è¡¨å¤´ç»ç¹,n:å¾
å é¤çåæ°ç¬¬n个,ä¿è¯næ¯ææç
* @return: ListNode:è¿åå é¤åç头ç»ç¹
*/
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode cursor = head;
//计ç®é¾è¡¨é¿åº¦
int length = 0;
while (cursor != null) {
length++;
cursor = cursor.next;
}
//转æ¢åæ°ä¸ºæ£æ°
int index = length - n;
//妿å é¤çæ¯ç¬¬ä¸ä¸ª,ç´æ¥å é¤
if (index == 0) {
ListNode next = head.next;
head.next = null;
return next;
}
cursor = head;
ListNode pre = null;
while (index > 0) {
pre = cursor;
cursor = cursor.next;
index--;
}
pre.next = cursor.next;
return head;
}
/*
* @description: åæéåæ³,åªéè¦éå1é
*/
public ListNode removeNthFromEnd2(ListNode head, int n) {
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode fast = newHead;
ListNode slow = newHead;
while (n >= 0) {
fast = fast.next;
n--;
}
//第ä¸ä¸ªæéå°è¾¾ç»ç¹åæ¢éå
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return newHead.next;
}
/*
* @description: 20.ææçæ¬å·
* @param: s:åªå
嫿¬å·()[]{}çå符串
* @return: boolean:sæ¯å¦ææ
*/
public boolean isValid(String s) {
Stack stack = new Stack<>();
for (int i = 0, l = s.length(); i < l; i++) {
char c = s.charAt(i);
if (stack.isEmpty() || isLeft(c)) {
stack.push(c);
} else {
if (stack.peek() == getRight(c)) {
stack.pop();
} else {
break;
}
}
}
return stack.isEmpty();
}
private boolean isLeft(char c) {
return c == '(' || c == '[' || c == '{';
}
private char getRight(char c) {
if (c == ')')
return '(';
if (c == ']')
return '[';
return '{';
}
/*
* @description: 21.å并两个æåºé¾è¡¨
* @param: l1,l2:æåºé¾è¡¨
* @return: ListNode:åå¹¶åçé¾è¡¨
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode cursor = head;
while (l1 != null || l2 != null) {
if (l1 == null) {
cursor.next = new ListNode(l2.val);
l2 = l2.next;
} else if (l2 == null) {
cursor.next = new ListNode(l1.val);
l1 = l1.next;
} else {
if (l1.val < l2.val) {
cursor.next = new ListNode(l1.val);
l1 = l1.next;
} else {
cursor.next = new ListNode(l2.val);
l2 = l2.next;
}
}
cursor = cursor.next;
}
return head.next;
}
/*
* @description: 22.æ¬å·çæ
* @param: n:ï¼æ¬å·å¯¹æ°
* @return: List:ææææçå¯è½æ§ç»åæ°
*/
public List generateParenthesis(int n) {
List result = new ArrayList<>();
generateParenthesis(n, 0, 0, "", result);
return result;
}
/*
* @description: çææ¬å·,n:æ¬å·å¯¹æ°,l:å·¦æ¬å·æ°,r:峿¬å·æ°,s:å½åå符串,result:ç»æé
*/
private void generateParenthesis(int n, int l, int r, String s, List result) {
if (l == n && r == n) {
result.add(s);
}
if (l < n) {
generateParenthesis(n, l + 1, r, s + "(", result);
}
if (r < l) {
generateParenthesis(n, l, r + 1, s + ")", result);
}
}
/*
* @description: 23.åå¹¶K个ååºé¾è¡¨
* @param: listsé¾è¡¨æ°ç»
* @return: åå¹¶åé¾è¡¨å¤´
*/
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
if (lists.length == 1) {
return lists[0];
}
List nodeList = new ArrayList<>();
for (int i = 0; i < lists.length; i++) {
ListNode head = lists[i];
while (head != null) {
nodeList.add(head.val);
head = head.next;
}
}
Collections.sort(nodeList);
ListNode head = new ListNode(0);
ListNode current = head;
for (int i = 0; i < nodeList.size(); i++) {
ListNode node = new ListNode(nodeList.get(i));
current.next = node;
current = node;
}
return head.next;
}
/*
* @description: 使ç¨2è·¯å½å¹¶åå¹¶
*/
public ListNode mergeKLists2(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
if (lists.length == 1) {
return lists[0];
}
return merge(lists, 0, lists.length - 1);
}
private ListNode merge(ListNode[] lists, int l, int r) {
if (l == r) {
return lists[l];
}
if (l + 1 == r) {
return mergeTwoLists(lists[l], lists[r]);
}
int mid = (l + r) / 2;
ListNode l1 = merge(lists, l, mid);
ListNode l2 = merge(lists, mid + 1, r);
return mergeTwoLists(l1, l2);
}
/*
* @description: 24.两两交æ¢é¾è¡¨ä¸çèç¹
* @param: headé¾è¡¨å¤´
* @return: ListNode:交æ¢åçé¾è¡¨
*/
public ListNode swapPairs(ListNode head) {
//é¾è¡¨åªæ0个æ1个ç»ç¹æ¶,æ æ³äº¤æ¢
if (head == null || head.next == null) {
return head;
}
// ListNode current = head;
ListNode next = head.next;
head.next = swapPairs(next.next);
next.next = head;
return next;
}
/*
* @description: ééå½å®ç°
*/
public ListNode swapPairs2(ListNode head) {
//é¾è¡¨åªæ0个æ1个ç»ç¹æ¶,æ æ³äº¤æ¢
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
head.next = swapPairs(next.next);
next.next = head;
return next;
}
/*
* @description: 25.K个ä¸ç»ç¿»è½¬é¾è¡¨
* @param: headé¾è¡¨å¤´ç»ç¹,kæ°é
* @return: ListNode:翻转åçé¾è¡¨
*/
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || head.next == null || k == 0) {
return head;
}
ListNode index = head;
int i = k;
while (i - 1 > 0) {
index = index.next;
if (index == null) {
return head;
}
i--;
}
ListNode temp = index.next;
index.next = null;
ListNode newHead = reverse(head);
head.next = reverseKGroup(temp, k);
return newHead;
}
/*
* @description: 翻转é¾è¡¨
*/
private ListNode reverse(ListNode head) {
ListNode newHead = head;
while (head.next != null) {
ListNode next = head.next;
head.next = next.next;
next.next = newHead;
newHead = next;
}
return newHead;
}
/*
* @description: 26.å é¤æåºæ°ç»ä¸çéå¤é¡¹
* @param: nums:æåºæ°ç»
* @return: int:å é¤éå¤å
ç´ åçæ°ç»é¿åº¦
*/
public int removeDuplicates(int[] nums) {
if (nums.length < 2) {
return nums.length;
}
int slow = 0;
for (int fast = 1, l = nums.length; fast < l; fast++) {
if (nums[fast] != nums[slow]) {
slow++;
if (fast != slow) {
nums[slow] = nums[fast];
}
}
}
//slowæ¯ä¸æ ,æ°éåºè¯¥åå 1
return slow + 1;
}
/*
* @description: 27. ç§»é¤å
ç´
* @param: nums:æ°ç», val:éè¦ç§»é¤çå
ç´
* @return: int: ç§»é¤valå
ç´ åçæ°ç»é¿åº¦
*/
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
if (i != slow) {
int temp = nums[slow];
nums[slow] = nums[i];
nums[i] = temp;
}
slow++;
}
}
return slow;
}
//todo 28
/*
* @description: 29.两æ°ç¸é¤
* @param: dividendè¢«é¤æ°,divisor餿°
* @return: å(åæ´)
*/
public int divide(int dividend, int divisor) {
int ans = -1;
int sign = 1;
if (dividend > 0) {
sign = opposite(sign);
dividend = opposite(dividend);
}
if (divisor > 0) {
sign = opposite(sign);
divisor = opposite(divisor);
}
//ç±äºè¢«é¤æ°å餿°é½æ¯è´æ°,妿dividend>divisor
//说æ|dividend|<|divisor|
//å³|dividend|/|divisor| < 1,ç»æå°±æ¯0
if (dividend > divisor) {
return 0;
}
int originDividend = dividend;
int originDivisor = divisor;
dividend -= divisor;
while (divisor >= dividend) {
ans = ans + ans;
dividend -= divisor;
divisor += divisor;
}
int a = ans + opposite(divide(originDividend - divisor, originDivisor));
if (a == Integer.MIN_VALUE) {
if (sign > 0) {
return Integer.MAX_VALUE;
} else {
return Integer.MIN_VALUE;
}
} else {
if (sign > 0) {
return opposite(a);
} else {
return a;
}
}
}
private int opposite(int x) {
return ~x + 1;
}
/*
* @description: 30.ä¸²èææåè¯çå串
* @param: så符串,wordså串,words䏿æå符串é¿åº¦ç¸ç
* @return: ç¬¦åæ¡ä»¶çå符串起å§ä¸æ
*/
public List findSubstring(String s, String[] words) {
List result = new ArrayList<>();
//å符串æ°é
final int wordsNum = words.length;
if (wordsNum == 0 || s.isEmpty())
return result;
//å符串é¿åº¦
final int wordLength = words[0].length();
Map wordsMap = new HashMap<>();
for (String value : words) {
int num = wordsMap.getOrDefault(value, 0);
num++;
wordsMap.put(value, num);
}
//éåå符串
int end = s.length() - wordsNum * wordLength + 1;
for (int i = 0; i < end; i++) {
Map existMap = new HashMap<>();
int num = 0;
while (num < wordsNum) {
String word = s.substring(i + num * wordLength, i + (num + 1) * wordLength);
//妿å½åå符串æ¯wordsä¸
if (wordsMap.containsKey(word)) {
//å·²ç»ç¸ç
int wordNum = existMap.getOrDefault(word, 0);
if (wordNum == wordsMap.get(word)) {
break;
}
wordNum++;
existMap.put(word, wordNum);
} else {
break;
}
num++;
}
if (num == wordsNum) {
result.add(i);
}
}
return result;
}
/*
* @description: 31.ä¸ä¸ä¸ªæå
* @param: nums,intæ°ç»
* @return:
*/
public void nextPermutation(int[] nums) {
int end = nums.length - 1;
int i;
boolean needSort = true;
for (i = end; i > 0; i--) {
if (nums[i - 1] < nums[i]) {
i--;
needSort = false;
break;
}
}
//妿i==0è¯´ææ°ç»æ¯éåºç,
if (i == 0 && needSort) {
Arrays.sort(nums);
return;
}
int j;
//æ¾å°ç¬¬ä¸ä¸ªæ¯nums[i]å¤§çæ°å
for (j = end; j > i; j--) {
if (nums[j] > nums[i])
break;
}
//交æ¢nums[i],nums[j]
int temp;
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
Arrays.sort(nums, i + 1, nums.length);
}
/*
* @description: 32.æé¿æææ¬å·
* @param: så符串,ä»
å
å«'('å')'
* @return: è¾åºæé¿æææ¬å·çé¿åº¦
*/
public int longestValidParentheses(String s) {
int result = 0;
if (s == null || s.length() < 2) {
return result;
}
Stack stack = new Stack<>();
boolean[] validArray = new boolean[s.length()];
for (int i = 0, length = s.length(); i < length; i++) {
char c = s.charAt(i);
//1.æ 为空
//2.å·¦æ¬å·
if (stack.isEmpty() || c == '(') {
Entry entry = new Entry(i, c);
stack.push(entry);
continue;
}
//æ ä¸ä¸ºç©ºä¸ä¸ºå³æ¬å·
Entry topEntry = stack.peek();
if (topEntry.getC() == '(') {
validArray[i] = true;
validArray[topEntry.getIndex()] = true;
stack.pop();
} else {
Entry entry = new Entry(i, c);
stack.push(entry);
}
}
int count = 0;
for (boolean validStatus : validArray) {
if (validStatus) {
count++;
result = Math.max(result, count);
} else {
count = 0;
}
}
return result;
}
/*
* @description: 33.æç´¢æè½¬æåºæ°ç»,[0,1,2,4,5,6,7]-->[4,5,6,7,0,1,2]
* @param: numsæ°ç»ä¸å
å«éå¤å
ç´ ,targetç®æ å¼
* @return: target卿°ç»ä¸ç䏿 ,è¿å-1表示targetä¸åå¨
*/
public int search(int[] nums, int target) {
if (nums.length == 0)
return -1;
if (nums.length == 1)
return nums[0] == target ? 0 : -1;
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == target)
return mid;
//[l,mid]æåº
// l mid r
//[4, 5, 6, 7, 1, 2, 3]䏿¾5
if (nums[l] < nums[mid]) {
//targetèå´å¨[[nums[l],nums[mid])ä¹é´,èå´ç¼©å°å°[l,mid-1]
if (target >= nums[l] && target < nums[mid])
r = mid - 1;
//å¦åèå´ä¸º[mid+1,r]
else
l = mid + 1;
} else {
//[mid,r]æåº
// l mid r
//[5, 6, 7, 1, 2, 3, 4]
//targetèå´å¨([nums[mid],nums[n]]ä¹é´,èå´ç¼©å°å°(mid+1,r]
if (target > nums[mid] && target <= nums[r])
l = mid + 1;
//å¦åèå´ä¸º[l,mid-1]
else
r = mid - 1;
}
}
return -1;
}
/*
* @description: 34.å¨æåºæ°ç»ä¸æ¥æ¾å
ç´ ç第ä¸ä¸ªåæåä¸ä¸ªä½ç½®
* @param: numsç®æ æ°ç»,targetç®æ å¼
* @return: è¿åæå
åºç°targetåæååºç°targetçæ°ç»ä¸æ ,è¿å[-1,-1]表示æ°ç»ä¸ä¸åå¨ç®æ å¼
*/
public int[] searchRange(int[] nums, int target) {
int[] result = {-1, -1};
if (nums.length == 0)
return result;
//äºåæç´¢,å
ææå°å¼,忿大å¼
int min = searchLeft(nums, target);
//第ä¸éæç´¢åç°ç®æ å¼ä¸åå¨,ä¸éè¦ç¬¬äºéæç´¢äº
if (min == -1) return result;
int max = searchRight(nums, target);
//è¿å䏿
return new int[]{min, max};
}
private int searchLeft(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (nums[mid] >= target)
r = mid - 1;
else
l = mid + 1;
}
if (l >= nums.length || nums[l] != target) {
return -1;
}
return l;
}
private int searchRight(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (nums[mid] > target)
r = mid - 1;
else
l = mid + 1;
}
if (r < 0 || nums[r] != target) {
return -1;
}
return r;
}
/*
* @description: 35.æç´¢æå
¥ä½ç½®
* @param: numsæåºæ°ç»,targetæå
¥å¼
* @return: targetæå
¥ä½ç½®
*/
public int searchInsert(int[] nums, int target) {
int result = 0;
if (nums.length == 0)
return result;
for (; result < nums.length; result++) {
if (target <= nums[result])
break;
}
return result;
}
/*
* @description: 36.ææçæ°ç¬
* @param: board 9*9çè¡¨æ ¼
* @return: true为ææ,falseæ æ
*/
public boolean isValidSudoku(char[][] board) {
Set set = new HashSet<>();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
String s = "(" + board[i][j] + ")";
if (!set.add(s + i) || !set.add(j + s) || !set.add(i / 3 + s + j / 3))
return false;
}
}
}
return true;
}
/*
* @description: 37.è§£æ°ç¬
* @param: board:9*9çè¡¨æ ¼
* @return: void
*/
public void solveSudoku(char[][] board) {
// solver(board);
solver(board, 1);
}
private boolean solver(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
//ä»1å°è¯å°9
char num = '1';
while (num <= '9') {
//å½åæ°åæ¯å¦å·²ç»è¢«å¡«è¿äº
if (isValid(i, j, board, num)) {
board[i][j] = num;
if (solver(board)) {
return true;
} else {
board[i][j] = '.';
}
}
num++;
}
return false;
}
}
}
return true;
}
/*
* @description: éè¿countæ¥è®°å½å·²ç»å¡«è¿çæ ¼åæ°é,åå°éåçæ¬¡æ°ã
*/
private boolean solver(char[][] board, int count) {
for (int i = (count - 1) / 9; i < 9; i++) {
for (int j = (count - 1) % 9; j < 9; j++) {
if (board[i][j] == '.') {
//ä»1å°è¯å°9
char num = '1';
while (num <= '9') {
//å½åæ°åæ¯å¦å·²ç»è¢«å¡«è¿äº
if (isValid(i, j, board, num)) {
board[i][j] = num;
if (solver(board, ++count)) {
return true;
} else {
board[i][j] = '.';
count--;
}
}
num++;
}
return false;
} else {
count++;
}
}
}
return true;
}
private boolean isValid(int row, int col, char[][] board, char c) {
for (int i = 0; i < 9; i++) {
if (board[row][i] == c || board[i][col] == c) {
return false;
}
}
row = row / 3 * 3;
col = col / 3 * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[row + i][col + j] == c) {
return false;
}
}
}
return true;
}
public String countAndSay(int n) {
String result = "1";
if (n == 1)
return result;
for (int i = 1; i < n; i++) {
StringBuilder temp = new StringBuilder();
char c = result.charAt(0);
int count = 1;
for (int j = 1, l = result.length(); j < l; j++) {
if (result.charAt(j) == result.charAt(j - 1)) {
count++;
} else {
temp.append(count).append(c);
c = result.charAt(j);
count = 0;
}
}
temp.append(count).append(c);
result = temp.toString();
}
return result;
}
/*
* @description: 39.ç»åæ»å
* @param: candidates æ éå¤å
ç´ intæ°ç», targetç®æ å¼
* @return: candidates䏿æå
ç´ å为targetçç»å,å
ç´ å¯ä»¥éå¤ä½¿ç¨
*/
public List> combinationSum(int[] candidates, int target) {
List> result = new ArrayList<>();
combinationSum(candidates, target, 0, new ArrayDeque<>(), result);
return result;
}
private void combinationSum(int[] nums, int target, int start, Deque current, List> result) {
if (target == 0) {
List list = new ArrayList<>(current);
result.add(list);
return;
}
if (target > 0) {
for (int i = start, length = nums.length; i < length; i++) {
if (nums[i] <= target) {
current.addLast(nums[i]);
combinationSum(nums, target - nums[i], i, current, result);
current.removeLast();
}
}
}
}
/*
* @description: 40.ç»åæ»åII
* @param: candidates:æéå¤å
ç´ æ°ç»,target:ç®æ æ°,æææ°å齿¯æ£æ´æ°
* @return: candidates䏿æå¯ä»¥ä½¿æ°åå为targetçç»å,æ¯ä¸ªcandidates[i]åªè½è¢«éå䏿¬¡
*/
public List> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);//æé夿°æ®,å
æåº
List> result = new ArrayList<>();
combinationSum2(candidates, target, 0, new ArrayDeque<>(), result);
return result;
}
private void combinationSum2(int[] nums, int target, int start, Deque current, List> result) {
if (target == 0) {
result.add(new ArrayList<>(current));
return;
}
if (target > 0) {
for (int i = start, length = nums.length; i < length; i++) {
if (nums[i] <= target) {
//ä¸ä¸è½®å·²ç»éè¿ç´æ¥è·³è¿
if (i > start && nums[i] == nums[i - 1])
continue;
current.addLast(nums[i]);
combinationSum2(nums, target - nums[i], i + 1, current, result);
current.removeLast();
} else {
return;
}
}
}
}
/*
* @description: 41.缺失ç第ä¸ä¸ªæ£æ°,ç®æ³çæ¶é´å¤æåº¦åºä¸ºO(n),å¹¶ä¸åªè½ä½¿ç¨å¸¸æ°çº§å«çé¢å¤ç©ºé´
* @param: numsæ°ç»
* @return: ç¡®å®ç第ä¸ä¸ªæ£æ°
*/
public int firstMissingPositive(int[] nums) {
int length = nums.length;
for (int i = 1; i <= length; ) {
int k = nums[i - 1];
//n个æ°ç»æå¤§èå´[1,n]è¶
åºèå´çé½è®¾ç½®ä¸º-1
if (k <= 0 || k > nums.length) {
nums[i - 1] = -1;
i++;
} else {
//nums[i]=k,å°±æè¿ä¸ªå¼æ¾å°æ°ç»å°æ°ç»å°ç¬¬k个ä½ç½®,å³num[k-1]=k
if (nums[k - 1] != k) {
swap(nums, i - 1, k - 1);
} else {
i++;
}
}
}
int result;
for (result = 1; result <= length; result++) {
if (nums[result - 1] != result)
break;
}
return result;
}
private void swap(int[] nums, int i, int j) {
int temp;
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
/*
* @description: 43.å符串ç¸ä¹
* @param: num1, num2 éè´æ´æ°
* @return: num1*num2çåç¬¦ä¸²ç»æ
*/
public String multiply(String num1, String num2) {
String result = "0";
//num1æ¯0çæ
åµ
if (num1.equals("0")) {
return result;
}
int n = num2.length() - 1;
//num1ä¹ä¸num2çæ¯ä¸ä½
for (int i = n; i >= 0; i--) {
result = add(multiply(num1, num2.charAt(i), n - i), result);
System.out.println(result);
}
return result;
}
/*
* @description: å¤ä½æ°ä¹ä¸ä½æ°,
* @param: num1å¤ä½æ°,num2ä¸ä½æ°,depth num2ç使°,å³å颿å 个é¶,éè¦æ·»å å°ç»æåé¢
*/
private String multiply(String num1, char num2, int depth) {
if (num2 == '0') {
return "0";
}
int carry = 0;
int size = num1.length() + 1 + depth;
StringBuilder result = new StringBuilder();
for (int i = num1.length() - 1; i >= 0; i--) {
int num = multiply(num1.charAt(i), num2) + carry;
carry = num / 10;
num = num % 10;
result.append(num);
}
result.append(carry);
result.reverse();
char[] zero = new char[depth];
Arrays.fill(zero, '0');
result.append(zero);
if (carry == 0) {
return result.substring(1, size);
}
return result.toString();
}
/*
* @description: ä¸ä½æ°ä¹ä¸ä½æ°
*/
private int multiply(char num1, char num2) {
return (num1 - '0') * (num2 - '0');
}
/*
* @description: å¤ä½æ°å å¤ä½æ°
*/
private String add(String num1, String num2) {
if (num1.equals("0")) {
return num2;
}
if (num2.equals("0")) {
return num1;
}
StringBuilder result = new StringBuilder(num1.length() + 1);
int length = 0;
int n1 = num1.length() - 1;
int n2 = num2.length() - 1;
int carry = 0;
while (n2 >= 0) {
int num = add(num1.charAt(n1), num2.charAt(n2)) + carry;
n1--;
n2--;
length++;
carry = num / 10;
num = num % 10;
result.append(num);
}
while (n1 >= 0) {
int num = add(num1.charAt(n1), '0') + carry;
n1--;
length++;
carry = num / 10;
num = num % 10;
result.append(num);
}
if (carry == 1) {
result.append(carry);
length++;
}
return result.reverse().substring(0, length);
}
/*
* @description: ä¸ä½æ°å ä¸ä½æ°
*/
private int add(char num1, char num2) {
return (num1 - '0') + (num2 - '0');
}
//todo 42,44
/*
* @description: 46.å
¨æå
* @param: numsæ°ç»,æ°åä¸éå¤
* @return: æ°ç»å
æ°åçæææåç»å
*/
public List> permute(int[] nums) {
int len = nums.length;
List> result = new ArrayList<>();
if (len == 0) {
return result;
}
boolean[] used = new boolean[len];
Deque path = new ArrayDeque<>(len);
dfs(nums, len, 0, path, used, result);
return result;
}
private void dfs(int[] nums, int len, int depth,
Deque path, boolean[] used,
List> res) {
if (depth == len) {
List list = new ArrayList<>(path);
if (!res.contains(list))
res.add(list);
return;
}
for (int i = 0; i < len; i++) {
if (!used[i]) {
path.addLast(nums[i]);
used[i] = true;
dfs(nums, len, depth + 1, path, used, res);
used[i] = false;
path.removeLast();
}
}
}
/*
* @description: 47.å
¨æå
* @param: numsæ°ç»,æ°åä¼éå¤
* @return: æ°ç»å
æ°åçæææåç»å
*/
public List> permuteUnique(int[] nums) {
int len = nums.length;
List> result = new ArrayList<>();
if (len == 0) {
return result;
}
boolean[] used = new boolean[len];
Deque path = new ArrayDeque<>(len);
dfs(nums, len, 0, path, used, result);
return result;
}
/*
* @description: 50.Pow(x, n)
* @param: xåºæ°, nææ°
* @return: xçn次æ¹
*/
public double myPow(double x, int n) {
//鲿¢Integer.MIN_VALUE溢åº
long N = n;
return N > 0 ? pow(x, N) : 1 / pow(x, -N);
}
private double pow(double x, long n) {
double result = 1.0;
while (n > 0) {
if ((n & 1) == 1) {
result = result * x;
}
x = x * x;
n = n >> 1;
}
return result;
}
/*
* @description: 51.N çå
* @param: n,n*nçæ£ç
* @return: ææçåæåå¯è½æ§
*/
public List> solveNQueens(int n) {
List> result = new ArrayList<>();
solveNQueens(n, new ArrayList<>(), result);
return result;
}
private void solveNQueens(int n, List current, List> result) {
if (current.size() == n) {
List temp = getResult(current);
result.add(temp);
return;
}
for (int col = 0; col < n; col++) {
//夿ä½ç½®æ¯å¦ææ
if (isValidPosition(current, col)) {
current.add(col);
//ç»§ç»æ±ä¸ä¸è¡çä½ç½®
solveNQueens(n, current, result);
current.remove(current.size() - 1);
}
}
}
/*
* @description: å°çåä½ç½®ä¿¡æ¯è½¬æ¢ææ£çæ ¼å¼çå符串,ç©ºæ ¼ç¨'.'表示,çåç¨'Q'表示
*/
private List getResult(List current) {
List temp = new ArrayList<>();
int n = current.size();
for (int i = 0; i < n; i++) {
char[] t = new char[n];
Arrays.fill(t, '.');
t[current.get(i)] = 'Q';
temp.add(new String(t));
}
return temp;
}
/*
* @description: å½åæå
¥ä½ç½®æ¯å¦ææ,è¡ä¸ºcurrent.size,å为col
*/
private boolean isValidPosition(List current, int col) {
int size = current.size();
for (int row = 0; row < size; row++) {
int existCol = current.get(row);
//å½å忝妿¾ç½®è¿
if (existCol == col) {
return false;
}
if (Math.abs(size - row) == Math.abs(col - current.get(row))) {
return false;
}
}
return true;
}
/*
* @description: 52.NçåII
* @param: n,n*nçæ£ç
* @return: ææçåæåå¯è½æ§æ°é
*/
public int totalNQueens(int n) {
return backtrack(new ArrayList<>(), n, 0);
}
private int backtrack(List current, int n, int count) {
if (current.size() == n) {
count++;
} else {
for (int col = 0; col < n; col++) {
//夿ä½ç½®æ¯å¦ææ
if (isValidPosition(current, col)) {
current.add(col);
//ç»§ç»æ±ä¸ä¸è¡çä½ç½®
count = backtrack(current, n, count);
current.remove(current.size() - 1);
}
}
}
return count;
}
/*
* @description: 53.æå¤§ååºå
* @param: nums intæ°ç»
* @return: æå¤§ååºåçå
*/
public int maxSubArray(int[] nums) {
int n = nums.length;
int sum = 0;
int maxSum = 0;
//åå¨nums齿¯è´æ°çæ
åµ,è¿æ¶åéè¦è¿åæå¤§å¼
boolean flag = false;
int max = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
max = Math.max(max, nums[i]);
if (nums[i] > 0) {
flag = true;
sum += nums[i];
maxSum = Math.max(maxSum, sum);
} else {
if ((sum + nums[i]) < 0) {
sum = 0;
} else {
sum += nums[i];
}
}
}
return flag ? maxSum : max;
}
/*
* @description: 54.èºæç©éµ
* @param: matrixäºç»´intæ°ç»
* @return: èºæè¾åº
*/
public List spiralOrder(int[][] matrix) {
List result = new ArrayList<>();
int m = matrix.length;
if (m == 0) {
return result;
}
int n = matrix[0].length;
int size = m * n;
int i = 0, j = 0;
//å®ä¹æ¹å å³j++,ä¸i++,å·¦j--,ä¸i--
int dir = 0;
int up = 0, down = m - 1, left = 0, right = n - 1;
while (size > 0) {
size--;
result.add(matrix[i][j]);
switch (dir) {
case 0:
if (j == right) {
//ä¸ééä½
up++;
//æ¹åæ¹å
dir = (dir + 1) % 4;
//åä¸
i++;
} else {
//ç»§ç»åå³
j++;
}
break;
case 1:
if (i == down) {
right--;
dir = (dir + 1) % 4;
j--;
} else {
i++;
}
break;
case 2:
if (j == left) {
down--;
dir = (dir + 1) % 4;
i--;
} else {
j--;
}
break;
case 3:
if (i == up) {
left++;
dir = (dir + 1) % 4;
j++;
} else {
i--;
}
break;
}
}
return result;
}
/*
* @description: 55.è·³è·æ¸¸æ
* @param: nums intæ°ç»,éè´æ´æ°,表示å½åä½ç½®è½ååè·³çæ¥æ°
* @return: trueè½è·³å°æåä¸ä¸ªä½ç½®,falseä¸è½è·³å°æåä¸ä¸ªä½ç½®
*/
public boolean canJump(int[] nums) {
int n = nums.length;
boolean[] arrival = new boolean[n];
arrival[0] = true;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (arrival[j] && (j + nums[j]) >= i) {
arrival[i] = true;
break;
}
}
}
return arrival[n - 1];
}
/*
* @description: 56.åå¹¶åºé´
* @param: intervals n*2æ°ç»
* @return: åå¹¶éå çåºé´
*/
public int[][] merge(int[][] intervals) {
int n = intervals.length;
List list = new ArrayList<>();
if (n == 0) {
return new int[][]{};
}
//æåº,èµ·ç¹ä»å°å°å¤§æå,èµ·ç¹ç¸åæ¶æç»ç¹ä»å°æå°å¤§æå
Arrays.sort(intervals, new Comparator() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0])
return o1[1] - o2[1];
return o1[0] - o2[0];
}
});
int start = intervals[0][0], end = intervals[0][1];
for (int i = 1; i < n; i++) {
//å½ååºé´å¨[start,end]ä¹é´
if (intervals[start][1] >= intervals[i][1]) {
continue;
}
//å½ååºé´èµ·ç¹å¤§äºèµ·ç¹å¤§äºçäºstart,使¯å°äºçäºend,é£ä¹å[start,end]æéå,æ´æ°endè³è¾å¤§çå¼
if (end >= intervals[i][0]) {
end = Math.max(end, intervals[i][1]);
} else {
//å½ååºé´å[start,end]没æéåæ¶,å°{start,end}å å
¥å表,ç¶åæ´æ°[start,end]
list.add(new int[]{start, end});
start = intervals[i][0];
end = intervals[i][1];
}
}
list.add(new int[]{start, end});
int[][] result = new int[list.size()][2];
return list.toArray(result);
}
/*
* @description: 59.èºæç©éµII
* @param: n æ£æ´æ°
* @return: ç产1-n^2èºæç©éµ
*/
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int size = n * n;
int i = 0, j = 0, k = 1;
//å®ä¹æ¹å å³j++,ä¸i++,å·¦j--,ä¸i--
int dir = 0;
int up = 0, down = n - 1, left = 0, right = n - 1;
while (size > 0) {
size--;
result[i][j] = k;
k++;
switch (dir) {
case 0:
if (j == right) {
//ä¸ééä½
up++;
//æ¹åæ¹å
dir = (dir + 1) % 4;
//åä¸
i++;
} else {
//ç»§ç»åå³
j++;
}
break;
case 1:
if (i == down) {
right--;
dir = (dir + 1) % 4;
j--;
} else {
i++;
}
break;
case 2:
if (j == left) {
down--;
dir = (dir + 1) % 4;
i--;
} else {
j--;
}
break;
case 3:
if (i == up) {
left++;
dir = (dir + 1) % 4;
j++;
} else {
i--;
}
break;
}
}
return result;
}
/*
* @description: 60.第k个æå
* @param: néå[1,2,3,â¦,n],k第k个æå
* @return: ä»å°å°å¤§ç第k个æå
*/
public String getPermutation(int n, int k) {
List number = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
number.add(String.valueOf(i));
}
return getPermutation(number, n, k);
}
private String getPermutation(List number, int n, int k) {
if (n == 1) {
return number.get(0);
}
int group = factorial(n - 1);
int index = (k - 1) / group;
String num = number.get(index);
number.remove(index);
k = k % group;
k = k == 0 ? group : k;
return num + getPermutation(number, n - 1, k);
}
private int factorial(int n) {
if (n <= 1)
return 1;
return n * factorial(n - 1);
}
/*
* @description: 61.æè½¬é¾è¡¨,å°é¾è¡¨åå³ç§»å¨
* @param: headé¾è¡¨å¤´,kç§»å¨æ¥æ°
* @return: æè½¬åçé¾è¡¨
*/
public ListNode rotateRight(ListNode head, int k) {
//æ éå¤ççæ
åµ,ç´æ¥è¿å
if (head == null || k == 0) {
return head;
}
int length = 0;
ListNode tmpHead = head;
ListNode end = null;
while (tmpHead != null) {
length++;
end = tmpHead;
tmpHead = tmpHead.next;
}
k = k % length;
//æè½¬åçé¾è¡¨å忥䏿¨¡ä¸æ ·
if (k == 0) {
return head;
}
ListNode newHead = head;
ListNode newEnd = head;
for (int i = 0; i < length - k; i++) {
newEnd = newHead;
newHead = newHead.next;
}
newEnd.next = null;
end.next = head;
return newHead;
}
/*
* @description: 62.ä¸åè·¯å¾
* @param: m,n m*nçè¡¨æ ¼
* @return: ä»è¡¨æ ¼å·¦ä¸è§å°å³ä¸è§çææè·¯å¾
*/
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
if (m == 1 || n == 1) {
return 1;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
dp[i][j] = 0;
} else if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
/*
* @description: 63.ä¸åè·¯å¾II
* @param: obstacleGrid äºç»´intæ°ç»,å¼ä¸º0æè
1,å
¶ä¸1表示éç¢ç©
* @return: ä»è¡¨æ ¼å·¦ä¸è§å°å³ä¸è§çææè·¯å¾
*/
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
if (m == 0) {
return 0;
}
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = 0;
//计ç®ç¬¬ä¸å
for (int i = 0; i < m; i++) {
//å½åå¨ä¸ä¸ªéç¢ç©æ¶,åç»è·¯å¾å°±ä¸éäº,ç´æ¥å
¨èµå¼ä¸º0
if (obstacleGrid[i][0] == 1) {
for (int j = i; j < m; j++) {
dp[j][0] = 0;
}
break;
} else {
dp[i][0] = 1;
}
}
//计ç®ç¬¬ä¸è¡
for (int i = 0; i < n; i++) {
//åä¸
if (obstacleGrid[0][i] == 1) {
Arrays.fill(dp[0], i, n, 0);
break;
} else {
dp[0][i] = 1;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1) {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
/*
* @description: 64.æå°è·¯å¾å
* @param: grid äºç»´intæ°ç»,表示 m x n ç½æ ¼
* @return: ä»grid[0][0]å°grid[m-1][n-1]è·¯å¾ä¸æ°åæå°æ»å
*/
public int minPathSum(int[][] grid) {
int m = grid.length;
if (m == 0) {
return 0;
}
int n = grid[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 && j == 0) {
dp[i][j] = grid[0][0];
} else if (i == 0) {
dp[i][j] = grid[i][j] + dp[i][j - 1];
} else if (j == 0) {
dp[i][j] = grid[i][j] + dp[i - 1][j];
} else {
dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[m - 1][n - 1];
}
/*
* @description: 71.ç®åè·¯å¾
* @param: path Unix飿 ¼æä»¶çç»å¯¹è·¯å¾
* @return: è§èè·¯å¾
*/
public String simplifyPath(String path) {
String[] dirs = path.split("/");
Deque wordList = new ArrayDeque<>(dirs.length);
for (String dirName : dirs) {
if (dirName.isEmpty() || dirName.equals(".")) {
continue;
}
if (dirName.equals("..")) {
if (!wordList.isEmpty())
wordList.removeLast();
continue;
}
wordList.addLast(dirName);
}
return "/" + String.join("/", wordList);
}
/*
* @description: 72.ç¼è¾è·ç¦»
* @param: [word1, word2]
* @return: int
*/
public int minDistance(String word1, String word2) {
int l1 = word1.length();
int l2 = word2.length();
//dp[i][j]表示word1åiåå符å°word2åj个å符çç¼è¾è·ç¦»
//0表示空å符串,æä»¥éè¦åå¤ç³è¯·ä¸ä¸ªæ°ç»ç©ºé´
int dp[][] = new int[l1 + 1][l2 + 1];
int equal = 1;
for (int i = 0; i <= l1; i++) {
for (int j = 0; j <= l2; j++) {
if (i == 0 || j == 0) {
dp[i][j] = i == 0 ? j : i;
} else {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
equal = 0;
}
dp[i][j] = Math.min(dp[i - 1][j - 1] + equal, Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));
equal = 1;
}
}
}
return dp[l1][l2];
}
/*
* @description: 73.ç©éµç½®é¶,妿ä¸ä¸ªå
ç´ ä¸º0,åå°å
¶æå¨è¡ååçææå
ç´ é½è®¾ä¸º0
* @param: matrix:äºç»´intæ°ç»
* @return:
*/
public void setZeroes(int[][] matrix) {
int m = matrix.length;
if (m == 0) {
return;
}
int n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = true;
col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
/*
* @description: 74.æç´¢äºç»´ç©éµ
* @param: matrixäºç»´ç©éµ,targetç®æ å¼
* @return: trueåå¨,falseä¸åå¨
*/
public boolean searchMatrix(int[][] matrix, int target) {
int row = matrix.length;
if (row == 0) {
return false;
}
int col = matrix[0].length;
if (col == 0) {
return false;
}
int l = 0;
int h = row * col - 1;
while (l <= h) {
int mid = l + ((h - l) >> 1);
int midInt = matrix[mid / col][mid % col];
if (midInt == target)
return true;
else if (midInt < target)
l = mid + 1;
else //if (midInt > target)
h = mid - 1;
}
return false;
}
/*
* @description: 75.é¢è²åç±»
* @param: nums:ä»
å
å«0,1,2çæ°ç»
* @return: æåº
*/
public void sortColors(int[] nums) {
int l = 0, r = nums.length - 1;
for (int i = 0; i <= r; i++) {
if (nums[i] == 0) {
int temp = nums[l];
nums[l] = nums[i];
nums[i] = temp;
l++;
} else if (nums[i] == 2) {
int temp = nums[r];
nums[r] = nums[i];
nums[i] = temp;
r--;
i--;
}
}
}
/*
* @description: 76.æå°è¦çå串
* @param: s,t:å符串
* @return: sä¸å
å«t䏿æå符çæå°å符串,ä¸å卿¯è¿å空å符串""
*/
public String minWindow(String s, String t) {
if (s.length() < t.length()) {
return "";
}
int[] countMap = new int[128];
int count = t.length();
for (int i = 0; i < count; i++) {
countMap[t.charAt(i)]++;
}
int indexL = 0, indexR = 0;
int left = 0, right = -1;
int minLength = Integer.MAX_VALUE;
while (indexR < s.length()) {
char rightChar = s.charAt(indexR);
//è¿ä¸æ¥å¾éè¦,å¨ä¸é¢ä¼ç¨å°
countMap[rightChar]--;
//妿å½åå符å¨tä¸
if (countMap[rightChar] >= 0) {
count--;
}
//
while (count == 0) {
int length = indexR - indexL + 1;
if (length < minLength) {
left = indexL;
right = indexR;
minLength = length;
}
char leftChar = s.charAt(indexL);
indexL++;
countMap[leftChar]++;
//tä¸å符æç»é½ä¼æ¯0,èå
¶ä»åç¬¦é½æ¯å°äº0,æä»¥å¯ä»¥å¤ææ¯å¦å¤§äº0æ¥å¤æå·¦è¾¹çå符æ¯ä¸æ¯å¨tä¸
if (countMap[leftChar] > 0) {
count++;
break;
}
}
indexR++;
}
return s.substring(left, right + 1);
}
/*
* @description: 77.ç»å
* @param: n èå´1-n, k æ°é
* @return: 1-nä¸éåkä¸ªçææç»å
*/
public List> combine(int n, int k) {
List> result = new ArrayList<>();
combine(n, k, 1, new ArrayList<>(), result);
return result;
}
/*
* @param: nèå´1-n,kéåæ°é,startèµ·å§æ°å,currentå½åå·²ç»é䏿°å,resultç»æé
*/
private void combine(int n, int k, int start, List current, List> dp) {
if (current.size() == k) {
List temp = new ArrayList<>(current);
dp.add(temp);
} else {
//i <= n - k + current.size() + 1 è¿è¡åªæ
//å³[start,n]å
ç´ ä¸ªæ°å·²ç»å°äºk-current.size(),ä¸å¯è½åä»ä¸ååºå°k个å
ç´ äº
// n - start + 1 < k - current.size() --> start > n - k+current.size() + 1
for (int i = start; i <= n - k + current.size() + 1; i++) {
if (!current.contains(i)) {
current.add(i);
combine(n, k, i + 1, current, dp);
current.remove(current.size() - 1);
}
}
}
}
/*
* @description: 78.åé
* @param: nums:ä¸å«éå¤å
ç´ çæ´æ°æ°ç»
* @return: ææå¯è½çåé
*/
public List> subsets(int[] nums) {
List> result = new ArrayList<>();
//é®é¢å解为77é¢ä»n个ä¸é夿°ä¸åk个,kä»0ï½néåå³å¯
for (int i = 0, l = nums.length; i <= nums.length; i++) {
List> currentResult = new ArrayList<>();
subsets(nums, i, 0, new ArrayDeque(), currentResult);
result.addAll(currentResult);
}
return result;
}
/*
* @description:ä»numsä¸éån个
*/
private void subsets(int[] nums, int n, int start, Deque current, List> currentResult) {
if (current.size() == n) {
currentResult.add(new ArrayList<>(current));
return;
}
for (int i = start, l = nums.length; i < l; i++) {
current.addLast(nums[i]);
subsets(nums, n, i + 1, current, currentResult);
current.removeLast();
}
}
/*
* @description: 79.åè¯æç´¢
* @param: boardäºç»´å符æ°ç», word:å符串
* @return: board䏿¯å¦å
å«word䏿æçå符
*/
public boolean exist(char[][] board, String word) {
int m = board.length;
if (m == 0) {
return word.isEmpty();
}
int n = board[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (exist(board, i, j, word, 0))
return true;
}
}
return false;
}
private boolean exist(char[][] board, int row, int col, String word, int index) {
//è¶
åºboardèå´
if (row < 0 || row > board.length - 1 || col < 0 || col > board[0].length - 1) {
return false;
}
//访é®è¿
if (board[row][col] == '*') {
return false;
}
//å符ä¸ç
if (board[row][col] != word.charAt(index)) {
return false;
}
index++;
//é¿åº¦ç¸çå·²ç»ç¸ç
if (index == word.length()) {
return true;
}
char c = board[row][col];
board[row][col] = '*';
if (exist(board, row + 1, col, word, index) ||
exist(board, row, col + 1, word, index) ||
exist(board, row - 1, col, word, index) ||
exist(board, row, col - 1, word, index)) {
return true;
}
board[row][col] = c;
return false;
}
/*
* @description: 80.å é¤æåºæ°ç»ä¸çéå¤é¡¹II
* @param: nums:æåºæ°ç»
* @return: å é¤éå¤å
ç´ åçé¿åº¦,éå¤å
ç´ æå¤åºç°2次
*/
public int removeDuplicates2(int[] nums) {
int n = nums.length;
//彿°ç»å
å
ç´ æ°éä¸è¶
è¿2æ¶,æ 论å¦ä½é½æ¯æ»¡è¶³æ¡ä»¶é½
if (n <= 2) {
return nums.length;
}
int slow = 1;
int fast = 2;
for (; fast < n; fast++) {
//妿[slow-1]==[fast]
//é£ä¹å¨[slow-1,fast]åºé´å
é½å¼é½æ¯ç¸çç
//[slow-1,slow]å°±æ¯2个ç¸åçå¼,æä»¥éè¦å°ä¸åç弿¾å°slow+1ä½ç½®ä¸
if (nums[fast] != nums[slow - 1]) {
slow++;
nums[slow] = nums[fast];
}
}
return slow + 1;
}
/*
* @description: 81.æç´¢æè½¬æåºæ°ç»II
* @param: [nums, target]
* @return: boolean
*/
public boolean search2(int[] nums, int target) {
if (nums.length == 0)
return false;
if (nums.length == 1)
return nums[0] == target;
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == target)
return true;
//[l,mid]æåº
// l mid r
//[4, 5, 6, 7, 1, 2, 3]䏿¾5
if (nums[l] < nums[mid]) {
//targetèå´å¨[[nums[l],nums[mid])ä¹é´,èå´ç¼©å°å°[l,mid-1]
if (target >= nums[l] && target < nums[mid])
r = mid - 1;
//å¦åèå´ä¸º[mid+1,r]
else
l = mid + 1;
} else if (nums[l] == nums[mid]) {
//ç±äºæéå¤å
ç´ ,æ æ³å¤æ,æç®åçæ¹æ³å°±æ¯å°lç§»é¤,èå´ç¼©å°è³[l+1,r]åæç´¢ä¸æ¬¡
// l mid r
//[1, 2, 3, 1, 0, 0, 1]
// l r
l++;
} else {
//[mid,r]æåº
// l mid r
//[5, 6, 7, 1, 2, 3, 4]
//targetèå´å¨([nums[mid],nums[r]]ä¹é´,èå´ç¼©å°å°[mid+1,r]
if (target > nums[mid] && target <= nums[r])
l = mid + 1;
//å¦åèå´ä¸º[l,mid-1]
else
r = mid - 1;
}
}
return false;
}
/*
* @description: 82.å 餿åºé¾è¡¨ä¸çéå¤å
ç´ ,ä¿çä¸ä¸ªéå¤å
ç´
* @param: headé¾è¡¨
* @return: å é¤éå¤å
ç´ åçé¾è¡¨
*/
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = new ListNode(head.val);
ListNode cursor = newHead;
int val = head.val;
head = head.next;
while (head != null) {
if (head.val != val) {
ListNode node = new ListNode(head.val);
cursor.next = node;
cursor = node;
}
head = head.next;
val = head.val;
}
return newHead;
}
/*
* @description: 83.å 餿åºé¾è¡¨ä¸çéå¤å
ç´ ,ä¸ä¿çéå¤å
ç´
* @param: headé¾è¡¨
* @return: å é¤éå¤å
ç´ åçé¾è¡¨
*/
public ListNode deleteDuplicates83(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = new ListNode(0);
ListNode cursor = newHead;
//ä¸ä¸ªå
ç´
int val = head.val;
//ä¸ä¸ªå
ç´ æ¯å¦åªåºç°è¿ä¸æ¬¡
boolean isFirst = true;
head = head.next;
while (head != null) {
if (head.val == val) {
isFirst = false;
} else {
//ä¸ä¸ªå
ç´ åªè¿åºç°ä¸æ¬¡
if (isFirst) {
ListNode node = new ListNode(val);
cursor.next = node;
cursor = node;
}
//ä¿®æ¹ä¸ä¸ªå
ç´ çå¼ä¸ºå½åç»ç¹çå¼
val = head.val;
isFirst = true;
if (head.next == null) {
cursor.next = new ListNode(val);
}
}
head = head.next;
}
return newHead.next;
}
/*
* @description: 84.æ±ç¶å¾ä¸æå¤§çç©å½¢
* @param: heights:intæ°ç»,表示é«åº¦
* @return: æå¤§ç©å½¢çé¢ç§¯
*/
public int largestRectangleArea(int[] heights) {
int maxArea = 0;
//è®©æ æé«åº¦éå¢,éå°å°äºæ é¡¶å
ç´ ç就让æ é¡¶å
ç´ åºæ
Stack stack = new Stack<>();
int p = 0;
while (p < heights.length) {
if (stack.isEmpty() || heights[p] >= heights[stack.peek()]) {
stack.push(p);
p++;
} else {
//è®¡ç®æ é¡¶
int height = heights[stack.pop()];
int left = stack.isEmpty() ? -1 : stack.peek();
//å½åæ¯æ é¡¶å°,使¯åä¸ä¸ªä¸å®ä¸ä¼æ¯æ é¡¶å°,å¦åå½åæ é¡¶è¯å®å·²ç»è¢«åºæ äº
int area = (p - left - 1) * height;
maxArea = Math.max(area, maxArea);
}
}
while (!stack.isEmpty()) {
//ä¿åæ é¡¶é«åº¦
int height = heights[stack.pop()];
//左边第ä¸ä¸ªå°äºå½åæ±åç䏿
int left = stack.isEmpty() ? -1 : stack.peek();
int area = (p - left - 1) * height;
maxArea = Math.max(area, maxArea);
}
return maxArea;
}
/*
* @description: 86.åéé¾è¡¨ ç»å®ä¸ä¸ªé¾è¡¨åä¸ä¸ªç¹å®å¼ x,对é¾è¡¨è¿è¡åé,ä½¿å¾ææå°äº x çèç¹é½å¨å¤§äºæçäº x çèç¹ä¹åã
* @param: headé¾è¡¨,xç¹å®å¼
* @return: åå²åçé¾è¡¨
*/
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
ListNode lessNode = new ListNode(0);
ListNode lessCursor = lessNode;
ListNode greaterNode = new ListNode(0);
ListNode greaterCursor = greaterNode;
while (head != null) {
ListNode node = new ListNode(head.val);
if (head.val < x) {
lessCursor.next = node;
lessCursor = node;
} else {
greaterCursor.next = node;
greaterCursor = node;
}
head = head.next;
}
lessCursor.next = greaterNode.next;
return lessNode.next;
}
/*
* @description: 87.æ°ä¹±å符串
* @param: s1,s2:å符串
* @return: boolean
*/
public boolean isScramble(String s1, String s2) {
//夿null
if (s1 == null) {
return s2 == null;
}
if (s2 == null) {
return false;
}
//夿é¿åº¦
if (s1.length() != s2.length()) {
return false;
}
//夿s1ås2æ¯ä¸æ¯ç¸ç
if (s1.equals(s2)) {
return true;
}
//夿s1ås2æ¯å¦æ¯ç¸ååç¬¦ç»æ
if (!isEqualChar(s1, s2)) {
return false;
}
for (int i = 1, l = s1.length(); i < l; i++) {
//s1 a - b
//s2 a - b
// 0-i i-l
if (isScramble(s1.substring(0, i), s2.substring(0, i)) && isScramble(s1.substring(i), s2.substring(i))) {
return true;
}
//s1 a - b
// 0-i i-l
//s2 b - a
// 0-i i-l
if (isScramble(s1.substring(0, i), s2.substring(l - i)) && isScramble(s1.substring(i), s2.substring(0, l - i))) {
return true;
}
}
return false;
}
/*
* @description: 夿å符串æ¯å¦ç±ç¸åçåç¬¦ç»æ
*/
private boolean isEqualChar(String s1, String s2) {
int[] letters = new int[26];
for (int i = 0, l = s1.length(); i < l; i++) {
letters[s1.charAt(i) - 'a']++;
letters[s2.charAt(i) - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (letters[i] != 0) {
return false;
}
}
return true;
}
/*
* @description: 89.æ ¼é·ç¼ç
* @param: n:使°[0,2^n-1]
* @return: æ ¼é·ç¼ç ,两个è¿ç»çæ°å¼ä»
æä¸ä¸ªbit使°çå·®å¼
*/
//todo æ¶é´å¤æåº¦å¤ªé«äº
public List grayCode(int n) {
int num = 1 << n;
List result = new ArrayList<>();
boolean[] visited = new boolean[num];
grayCode(num, visited, new ArrayList<>(), result);
return result;
}
private void grayCode(int n, boolean[] visited, List current, List result) {
if (current.size() == n) {
if (validGrayCode(current)) {
result.addAll(current);
return;
}
}
for (int i = 0; i < n; i++) {
if (visited[i])
continue;
current.add(i);
visited[i] = true;
grayCode(n, visited, current, result);
visited[i] = false;
current.remove(current.size() - 1);
if (!result.isEmpty()) {
break;
}
}
}
//O(n)
private boolean validGrayCode(List list) {
int size = list.size();
if (size == 0)
return true;
for (int i = 0; i < size - 1; i++) {
if (!validGrayCode(list.get(i), list.get(i + 1))) {
return false;
}
}
return true;
}
private boolean validGrayCode(int x, int y) {
int z = x ^ y;
int count = 0;
while (z > 0) {
count += (z & 1);
if (count > 1) {
return false;
}
z = z >> 1;
}
return true;
}
/*
* @description: 90.åéII
* @param: nums:å
å«éå¤å
ç´ çæ´æ°æ°ç»
* @return: ææå¯è½çåé
*/
public List> subsetsWithDup(int[] nums) {
List> result = new ArrayList<>();
Arrays.sort(nums);
//类似78é¢,åªéè¦èèéå¤å
ç´
for (int i = 0, l = nums.length; i <= nums.length; i++) {
List> currentResult = new ArrayList<>();
subsetsWithDup(nums, i, 0, new ArrayDeque(), currentResult);
result.addAll(currentResult);
}
return result;
}
private void subsetsWithDup(int[] nums, int n, int start, Deque
current, List> currentResult) {
if (current.size() == n) {
currentResult.add(new ArrayList<>(current));
return;
}
for (int i = start, l = nums.length; i < l; i++) {
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
current.addLast(nums[i]);
subsetsWithDup(nums, n, i + 1, current, currentResult);
current.removeLast();
}
}
/*
* @description: 91.è§£ç æ¹æ³,å°æ°å1-26æ å°å°å¤§å忝A-Z
* @param: s:å符串ä»
æ°ç»
* @return: int:å°å符串æ°åæ å°å°å符æå¤å°ç§æ¹å¼,ä¾å¦123å¯ä»¥æå为1-2-3,1-23æè
12-3
*/
public int numDecodings(String s) {
HashMap memoization = new HashMap<>();
return numDecodings(s, 0, memoization);
}
private int numDecodings(String s, int start, HashMap memoization) {
if (start == s.length()) {
return 1;
}
if (s.charAt(start) == '0') {
return 0;
}
//夿ä¹åæ¯å¦è®¡ç®è¿
int m = memoization.getOrDefault(start, -1);
if (m != -1) {
return m;
}
int ans1 = numDecodings(s, start + 1, memoization);
int ans2 = 0;
//妿å符串åç»è¿æ2ä½
if (start < s.length() - 1) {
int num = ((s.charAt(start) - '0') * 10) + s.charAt(start + 1) - '0';
if (num <= 26) {
ans2 = numDecodings(s, start + 2, memoization);
}
}
//å°ç»æä¿å
memoization.put(start, ans1 + ans2);
return ans1 + ans2;
}
/*
* @description: 92.å转é¾è¡¨II
* @param: headé¾è¡¨ m,nå转èå´
* @return: å转åçé¾è¡¨
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || head.next == null) {
return head;
}
if (m == n) {
return head;
}
ListNode newHead = new ListNode(0);
newHead.next = head;
int count = 1;
ListNode pre = newHead;
//æ¾å°å转çèµ·ç¹
while (count < m) {
count++;
pre = pre.next;
head = head.next;
}
ListNode left = pre;
ListNode right = head;
pre = pre.next;
head = head.next;
count++;
//å转é¾è¡¨
while (count < n) {
count++;
ListNode temp = head.next;
head.next = pre;
pre = head;
head = temp;
}
//
right.next = head.next;
head.next = pre;
left.next = head;
return newHead.next;
}
/*
* @description: 93.å¤åIPå°å
* @param: String:ä»
å
嫿°åçå符串
* @return: List:ææææçipå°å
*/
public List restoreIpAddresses(String s) {
List result = new ArrayList<>();
//IPå°åçææé¿åº¦èå´ä¸º[4,12]
if (s.length() < 4 || s.length() > 12) {
return result;
}
restoreIpAddresses(s, 0, 0, new StringBuilder(), result);
return result;
}
public void restoreIpAddresses(String s, int start, int count, StringBuilder current, List result) {
//彿åå©ä½çæ°åé½åä¸ä½æ°è¿æä½çæ¶å,说æåé¢åå°äº,æååªæ
if (s.length() - start > 3 * (4 - count)) {
return;
}
if (count == 4) {
if (start == s.length()) {
result.add(new String(current.delete(current.length() - 1, current.length())));//å 餿åä¸ä¸ªç¹
}
return;
}
//count没å°4
if (start == s.length()) {
return;
}
StringBuilder temp = new StringBuilder(current);
current.append(s, start, start + 1).append(".");
restoreIpAddresses(s, start + 1, count + 1, current, result);
//ä¸ä½æ°å
许0.0.0.0
//使¯å¤ä½æ°ä¸å
许0å¼å¤´
if (s.charAt(start) == '0')
return;
if (start + 1 < s.length()) {
current = new StringBuilder(temp);
current.append(s, start, start + 2).append(".");
restoreIpAddresses(s, start + 2, count + 1, current, result);
}
if (start + 2 < s.length()) {
//ä¸ä½æ°æææ°å为[100,255]
if (Integer.valueOf(s.substring(start, start + 3)) <= 255) {
current = new StringBuilder(temp);
current.append(s, start, start + 3).append(".");
restoreIpAddresses(s, start + 3, count + 1, current, result);
}
}
}
/*
* @description: 94.äºåæ çä¸åºéå
* @param: root,äºåæ æ ¹ç»ç¹
* @return: ä¸åºéåç»æ
*/
public List inorderTraversal(TreeNode root) {
List result = new ArrayList();
inorderTraversal(root, result);
return result;
}
/*
* @description: ä¸åºéå
*/
private void inorderTraversal(TreeNode node, List list) {
if (node == null)
return;
inorderTraversal(node.left, list);
list.add(node.val);
inorderTraversal(node.right, list);
}
/*
* @description: 95.ä¸åçäºåæç´¢æ II
* @param: n:1-n
* @return: List:ææä¸åçäºåæç´¢æ
*/
public List generateTrees(int n) {
if (n == 0) {
return new ArrayList<>();
}
return generateTrees(1, n);
}
private List generateTrees(int start, int end) {
List result = new ArrayList<>();
if (start > end) {
result.add(null);
return result;
}
if (start == end) {
TreeNode node = new TreeNode(start);
result.add(node);
return result;
}
//æ ¹ç»ç¹ä»1-néå
for (int i = start; i <= end; i++) {
//å·¦åæ ä¸ºstart-(i-1)
List leftTree = generateTrees(start, i - 1);
//å³åæ 为(i+1)-end
List rightTree = generateTrees(i + 1, end);
//å·¦åæ åå³åæ ç¬å¡å°ç§¯
for (TreeNode left : leftTree) {
for (TreeNode right : rightTree) {
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
result.add(root);
}
}
}
return result;
}
/*
* @description: 96.ä¸åçäºåæç´¢æ
* @param: n:1-n
* @return: int:ææä¸åçäºåæç´¢æ çæ°é
*/
public int numTrees(int n) {
return numTrees(n, new HashMap<>());
}
private int numTrees(int n, Map memoization) {
int result = memoization.getOrDefault(n, -1);
if (result != -1) {
return result;
}
result = 0;
if (n == 0 || n == 1) {
return 1;
}
for (int i = 1; i <= n; i++) {
int leftNum = numTrees(i - 1, memoization);
int rightNum = numTrees(n - i, memoization);
result += leftNum * rightNum;
}
memoization.put(n, result);
return result;
}
/*
* @description: 97.交éå符串
* @param: s1,s2,s3:å符串
* @return: boolean:s3æ¯å¦å¯ä»¥ç±s1ås2çå符交éç»æ
*/
public boolean isInterleave(String s1, String s2, String s3) {
//1.s1==null && s2==null
if (s1 == null && s2 == null) {
return s3 == null;
}
//2.s1==null && s2!=null
if (s1 == null) {
return s2.equals(s3);
}
//3.s1!=null && s2==null
if (s2 == null) {
return s1.equals(s3);
}
//4.s1!=null && s2!=null
if (s1.length() + s2.length() != s3.length()) {
return false;
}
return isInterleave(s1, 0, s2, 0, s3, 0);
}
private boolean isInterleave(String s1, int index1, String s2, int index2, String s3, int index3) {
if (index3 == s3.length()) {
return true;
}
if (index1 == s1.length()) {
return s2.substring(index2).equals(s3.substring(index3));
}
if (index2 == s2.length()) {
return s1.substring(index1).equals(s3.substring(index3));
}
char c1 = s1.charAt(index1);
char c2 = s2.charAt(index2);
char c3 = s3.charAt(index3);
//s1ås2é¦ä½é½ås3å¹é
//å°è¯s1å¹é
ås2å¹é
if (c1 == c3 && c2 == c3) {
return isInterleave(s1, index1 + 1, s2, index2, s3, index3 + 1)
|| isInterleave(s1, index1, s2, index2 + 1, s3, index3 + 1);
}
//s1é¦ä½é½ås3å¹é
//å°s1ås3å忍è¿ä¸ä½
if (c1 == c3) {
return isInterleave(s1, index1 + 1, s2, index2, s3, index3 + 1);
}
//s2é¦ä½é½ås3å¹é
//å°s2ås3å忍è¿ä¸ä½
if (c2 == c3) {
return isInterleave(s1, index1, s2, index2 + 1, s3, index3 + 1);
}
//é½ä¸å¹é
,è¿åfalse
return false;
}
/*
* @description: 98.éªè¯äºåæç´¢æ
* @param: äºåæ æ ¹ç»ç¹
* @return: trueææäºåæç´¢æ ,falseæ æäºåæç´¢æ
* èç¹çå·¦åæ åªå
å«å°äºå½åèç¹çæ°ã
* èç¹çå³åæ åªå
å«å¤§äºå½åèç¹çæ°ã
* ææå·¦åæ åå³åæ èªèº«å¿
须乿¯äºåæç´¢æ ã
*/
public boolean isValidBST(TreeNode root) {
if (root == null)
return true;
List list = new ArrayList<>();
//ææäºåæ ä¸åºéååºè¯¥æ¯éå¢ç
inorderTraversal(root, list);
//夿æ¯å¦éå¢å³å¯
for (int i = 0, l = list.size(); i < l - 1; i++) {
if (list.get(i + 1) <= list.get(i)) {
return false;
}
}
return true;
}
/*
* @description: 99.æ¢å¤äºåæç´¢æ
* @param: root
* @return: void
*/
public void recoverTree(TreeNode root) {
}
/*
* @description: 102.äºåæ çå±åºéå
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List>:äºåæ å±åºéåç»æ,å
¶ä¸List为ç¸åå±ç»ç¹çå¼
*/
public List> levelOrder(TreeNode root) {
List> result = new ArrayList<>();
Map> depthMap = new HashMap<>();
levelOrderTraversal(depthMap, root, 0);
for (int i = 0; i < depthMap.size(); i++) {
result.add(depthMap.get(i));
}
return result;
}
/*
* @description: å±åºéå
*/
private void levelOrderTraversal(Map> map, TreeNode node, int depth) {
if (node != null) {
if (map.containsKey(depth)) {
map.get(depth).add(node.val);
} else {
List list = new ArrayList<>();
list.add(node.val);
map.put(depth, list);
}
levelOrderTraversal(map, node.left, depth + 1);
levelOrderTraversal(map, node.right, depth + 1);
}
}
/*
* @description: 103.äºåæ çé¯é½¿å½¢å±æ¬¡éå
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List>:äºåæ å±åºéåç»æ,å
¶ä¸List为ç¸åå±ç»ç¹çå¼,第1å±å·¦å¾å³,第2å±ä»å³å¾å·¦ä»¥æ¤ç±»æ¨
*/
public List> zigzagLevelOrder(TreeNode root) {
List> result = new ArrayList<>();
Map> depthMap = new HashMap<>();
levelOrderTraversal(depthMap, root, 0);
for (int i = 0; i < depthMap.size(); i++) {
List list = depthMap.get(i);
if ((i & 1) == 1)
Collections.reverse(list);
result.add(depthMap.get(i));
}
return result;
}
/*
* @description: 105.ä»ååºä¸ä¸åºéååºåæé äºåæ
* @param: preorder:inorder:
* @return: TreeNode
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTree(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
private TreeNode buildTree(int[] preorder, int pStart, int pEnd, int[] inorder, int iStart, int iEnd) {
if (pStart == pEnd) {
return null;
}
int val = preorder[pStart];
TreeNode node = new TreeNode(val);
int index = 0;
for (int i = iStart; i < iEnd; i++) {
if (val == inorder[i]) {
index = i;
break;
}
}
int leftNum = index - iStart;
node.left = buildTree(preorder, pStart + 1, pStart + leftNum + 1, inorder, iStart, index);
node.right = buildTree(preorder, pStart + leftNum + 1, pEnd, inorder, index + 1, iEnd);
return node;
}
public TreeNode buildTree2(int[] inorder, int[] postorder) {
return buildTree2(inorder, 0, inorder.length, postorder, 0, postorder.length);
}
private TreeNode buildTree2(int[] inorder, int iStart, int iEnd, int[] postorder, int pStart, int pEnd) {
if (pStart == pEnd) {
return null;
}
int val = postorder[pEnd - 1];
TreeNode node = new TreeNode(val);
int index = 0;
for (int i = iStart; i < iEnd; i++) {
if (val == inorder[i]) {
index = i;
break;
}
}
int leftNum = index - iStart;
node.left = buildTree2(inorder, iStart, index, postorder, pStart, pStart + leftNum);
node.right = buildTree2(inorder, index + 1, iEnd, postorder, pStart + leftNum, pEnd - 1);
return node;
}
/*
* @description: 107.äºåæ ç屿¬¡éåII
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List>:äºåæ å±åºéåèªåºåä¸ç»æ,å
¶ä¸List为ç¸åå±ç»ç¹çå¼
*/
public List> levelOrderBottom(TreeNode root) {
List> result = new ArrayList<>();
Map> depthMap = new HashMap<>();
levelOrderTraversal(depthMap, root, 0);
for (int i = depthMap.size() - 1; i >= 0; i--) {
result.add(depthMap.get(i));
}
return result;
}
/*
* @description: 108.å°æåºæ°ç»è½¬æ¢ä¸ºäºåæç´¢æ
* @param: nums:intæ°ç»
* @return: TreeNode
*/
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}
private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
if (start > end) {
return null;
}
int mid = start + (end - start) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, start, mid - 1);
root.right = sortedArrayToBST(nums, mid + 1, end);
return root;
}
/*
* @description: 110.平衡äºåæ
* @param: root:äºåæ æ ¹ç»ç¹
* @return: boolean:æ¯å¦ä¸ºå¹³è¡¡äºåæ
*/
public boolean isBalanced(TreeNode root) {
return getTreeDepth(root) != -1;
}
private int getTreeDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = getTreeDepth(root.left);
if (leftDepth == -1) {
return -1;
}
int rightDepth = getTreeDepth(root.right);
if (rightDepth == -1) {
return -1;
}
if (Math.abs(leftDepth - rightDepth) != 1) {
return -1;
}
return Math.max(leftDepth, rightDepth) + 1;
}
/*
* @description: 111.äºåæ çæå°æ·±åº¦
* @param: root:äºåæ æ ¹ç»ç¹
* @return: int:æå°æ·±åº¦
*/
public int minDepth(TreeNode root) {
return 0;
}
/*
* @description: 113.è·¯å¾æ»åII
* @param: root:äºåæ æ ¹ç®å½,sum:å
* @return: List>:ææä»æ ¹èç¹å°å¶åèç¹è·¯å¾æ»åçäºç»å®ç®æ åçè·¯å¾
*/
public List> pathSum(TreeNode root, int sum) {
List> result = new ArrayList<>();
Deque current = new ArrayDeque<>();
pathSum(root, sum, current, result);
return result;
}
private void pathSum(TreeNode root, int sum, Deque current, List> result) {
if (root == null) {
return;
}
//å½åæ¯å¶åç»ç¹
current.addLast(root.val);
if (root.left == null && root.right == null) {
if (sum == root.val) {
result.add(new ArrayList<>(current));
}
}
pathSum(root.left, sum - root.val, current, result);
pathSum(root.right, sum - root.val, current, result);
current.removeLast();
}
/*
* @description: 114.äºåæ å±å¼ä¸ºé¾è¡¨,åå°å°å®å±å¼ä¸ºä¸ä¸ªåé¾è¡¨
* @param: root:äºåæ æ ¹ç»ç¹
* @return: void
*/
public void flatten(TreeNode root) {
while (root != null) {
if (root.left != null) {
TreeNode oldRight = root.right;
TreeNode newRight = root.left;
root.right = newRight;
root.left = null;
while (newRight.right != null) {
newRight = newRight.right;
}
newRight.right = oldRight;
}
root = root.right;
}
}
/*
* @description: 116.å¡«å
æ¯ä¸ªèç¹çä¸ä¸ä¸ªå³ä¾§èç¹æé
* @param: root: å®ç¾äºåæ æ ¹ç»ç¹
* @return: Node:
*/
public Node connect(Node root) {
connectNode(root);
return root;
}
private void connectNode(Node root) {
if (root == null || root.left == null) {
return;
}
//è¿æ¥å½åç»ç¹å·¦å³å©åç»ç¹
root.left.next = root.right;
root.right.next = (root.next == null) ? null : root.next.left;
connect(root.left);
connect(root.right);
}
/*
* @description: 117.å¡«å
æ¯ä¸ªèç¹çä¸ä¸ä¸ªå³ä¾§èç¹æéII
* @param: root:äºåæ æ ¹ç»ç¹
* @return: leetcode.entity.Node
*/
public Node connect2(Node root) {
connectNode2(root);
return root;
}
private void connectNode2(Node node) {
if (node == null) {
return;
}
if (node.left == null && node.right == null) {
return;
}
if (node.left != null && node.right != null) {
node.left.next = node.right;
node.right.next = getNextChildNode(node.next);
} else if (node.left == null) {
node.right.next = getNextChildNode(node.next);
} else if (node.right == null) {
node.left.next = getNextChildNode(node.next);
}
connectNode2(node.left);
connectNode2(node.right);
}
//å¤çnext
private Node getNextChildNode(Node node) {
while (true) {
if (node == null) {
return null;
} else {
if (node.left != null) {
return node.left;
} else if (node.right != null) {
return node.right;
}
}
node = node.next;
}
}
/*
* @description: 128.æé¿è¿ç»åºå
* @param: nums: intæ°ç»
* @return: int: æé¿è¿ç»åºåçé¿åº¦
*/
public int longestConsecutive(int[] nums) {
Set numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int maxCount = 0;
int count = 0;
for (int num : nums) {
if (!numSet.contains(num - 1)) {
count = 0;
while (numSet.contains(num)) {
count++;
num++;
}
}
maxCount = Math.max(maxCount, count);
}
return maxCount;
}
/*
* @description: 142.ç¯å½¢é¾è¡¨II
* @param: head:é¾è¡¨å¤´ç»ç¹
* @return: ListNode: å
¥ç¯ç第ä¸ä¸ªç»ç¹,å½é¾è¡¨æ ç¯æ¶è¿ånull
*/
public ListNode detectCycle(ListNode head) {
Set nodeSet = new HashSet<>();
while (head != null) {
if (nodeSet.add(head) == false)
return head;
}
return null;
}
/*
* @description: 144.äºåæ çååºéå
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List:ååºåºéåç»æ
*/
public List preorderTraversal(TreeNode root) {
List result = new ArrayList();
preorderTraversal(root, result);
return result;
}
/*
* @description: ååºéå
*/
private void preorderTraversal(TreeNode node, List list) {
if (node == null)
return;
list.add(node.val);
preorderTraversal(node.left, list);
preorderTraversal(node.right, list);
}
/*
* @description: 145.äºåæ çååºéå
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List:ååºåºéåç»æ
*/
public List postorderTraversal(TreeNode root) {
List result = new ArrayList();
postorderTraversal(root, result);
return result;
}
/*
* @description: ååºéå
*/
private void postorderTraversal(TreeNode node, List list) {
if (node == null)
return;
postorderTraversal(node.left, list);
postorderTraversal(node.right, list);
list.add(node.val);
}
/*
* @description: 150.éæ³¢å
°è¡¨è¾¾å¼æ±å¼
* @param: tokens:表达å¼
* @return: int:éæ³¢å
°è¡¨è¾¾å¼ç»æ
*/
public int evalRPN(String[] tokens) {
Stack stack = new Stack<>();
for (int i = 0, n = tokens.length; i < n; i++) {
String token = tokens[i];
if (isOperator(token)) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(calculate(num2, num1, token));
} else {
stack.push(Integer.valueOf(token));
}
}
return stack.pop();
}
/*
* @description: 夿å符æ¯å¦æ¯+ - * /ä¸çä¸ä¸ª
*/
private boolean isOperator(String token) {
return "+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token);
}
/*
* @description: æ ¹æ®æä½ç¬¦è®¡ç®aåbçç»æ
*/
private int calculate(int a, int b, String operator) {
int result = 0;
switch (operator) {
case "+":
result = a + b;
break;
case "-":
result = a - b;
break;
case "*":
result = a * b;
break;
case "/":
result = a / b;
break;
}
return result;
}
/*
* @description: 347.å K 个é«é¢å
ç´
* @param: nums,é空intæ°ç», k个æ°
* @return: åºç°æ¬¡æ°æå¤çk个
*/
public int[] topKFrequent(int[] nums, int k) {
int[] result = new int[k];
//key-num value-count
Map countMap = new HashMap<>();
//ç»è®¡åºç°æ¬¡æ° O(n)
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
PriorityQueue queue = new PriorityQueue<>(new Comparator() {
@Override
public int compare(int[] m, int[] n) {
return m[1] - n[1];
}
});
//O(nlogk)
for (Map.Entry entry : countMap.entrySet()) {
int num = entry.getKey(), count = entry.getValue();
if (queue.size() == k) {
if (queue.peek()[1] < count) {
queue.poll();
queue.offer(new int[]{num, count});
}
} else {
queue.offer(new int[]{num, count});
}
}
for (int i = 0; i < k; ++i) {
result[i] = queue.poll()[0];
}
return result;
}
/*
* @description: 404.å·¦å¶åä¹å
* @param: root:äºåæ æ ¹ç»ç¹
* @return: int:å·¦å¶åä¹å
*/
public int sumOfLeftLeaves(TreeNode root) {
return root == null ? 0 : sum(root);
}
private int sum(TreeNode root) {
int result = 0;
if (root.left != null) {
//æ¯å¶åç»ç¹
if (root.left.left == null && root.left.right == null) {
result += root.left.val;
} else {
result += sum(root.left);
}
}
if (root.right != null) {
result += sum(root.right);
}
return result;
}
/*
* @description: 414.第ä¸å¤§çæ°
* @param: numsæ°ç»
* @return: è¿å第ä¸å¤§çæ°,ä¸åå¨è¿åæå¤§çæ°
*/
public int thirdMax(int[] nums) {
long max = Long.MIN_VALUE;
long second = Long.MIN_VALUE;
long third = Long.MIN_VALUE;
for (int i = 0, length = nums.length; i < length; i++) {
int num = nums[i];
if (num > max) {
third = second;
second = max;
max = num;
continue;
}
if (num > second && num < max) {
third = second;
second = num;
continue;
}
if (num > third && num < second) {
third = num;
continue;
}
}
return third == Long.MIN_VALUE ? (int) max : (int) third;
}
public boolean canPartition(int[] nums) {
int sum = 0;
for (int i = 0, l = nums.length; i < l; i++) {
sum += nums[i];
}
if ((sum & 1) == 1) {
return false;
}
return canPartition(nums, 0, nums.length, 0, sum / 2, new HashMap());
}
private boolean canPartition(int[] nums, int start, int end, int current, int target, Map memoization) {
String key = current + "#" + start;
if (memoization.containsKey(key)) {
return memoization.get(key);
}
if (start >= end || current > target) {
return false;
}
if (current == target) {
return true;
}
boolean result = canPartition(nums, start + 1, end, current + nums[start], target, memoization)
|| canPartition(nums, start + 1, end, current, target, memoization);
memoization.put(key, result);
return result;
}
/*
* @description: 448.æ¾å°æææ°ç»ä¸æ¶å¤±çæ°å
* @param: numsæ°ç»èå´ä¸º1-n
* @return: æ¾åº1-n䏿¶å¤±çæ°å
*/
public List findDisappearedNumbers(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; ) {
int currentNum = nums[i];
if (currentNum <= 0 || currentNum > n) {
nums[i] = -1;
i++;
continue;
}
if (currentNum != (i + 1)) {
if (nums[currentNum - 1] == currentNum) {
nums[i] = -1;
i++;
} else {
int temp = nums[currentNum - 1];
nums[currentNum - 1] = nums[i];
nums[i] = temp;
}
} else {
i++;
}
}
List result = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (nums[i] == -1) {
result.add(i + 1);
}
}
return result;
}
/*
* @description: 485.æå¤§è¿ç»1ç个æ°
* @param: numsæ°ç»,ä»
å
å«0å1
* @return: æå¤§è¿ç»1ç个æ°
*/
public int findMaxConsecutiveOnes(int[] nums) {
int result = 0;
int count = 0;
for (int i = 0, length = nums.length; i < length; i++) {
if (nums[i] == 1) {
count++;
} else {
result = Math.max(result, count);
count = 0;
}
}
result = Math.max(result, count);
return result;
}
/*
* @description: 495.æè«æ»å»
* @param: timeSeriesæ°ç»è¡¨ç¤ºæ»å»æ¶é´,duration䏿¯æç»é´é
* @return: 䏿¯æ¶é´æ»å
*/
public int findPoisonedDuration(int[] timeSeries, int duration) {
int length = timeSeries.length;
if (length == 0) {
return 0;
}
if (length == 1) {
return duration;
}
int result = 0;
for (int i = 1; i < length; i++) {
int time = timeSeries[i] - timeSeries[i - 1];
result += Math.min(time, duration);
}
//æåä¸ä¸ªæ¶é´åå ä¸duration
result += duration;
return result;
}
/*
* @description: 538.æäºåæç´¢æ 转æ¢ä¸ºç´¯å æ
* @param: root:äºåæç´¢æ æ ¹ç»ç¹
* @return: TreeNode:æ¯ä¸ªèç¹ç弿¯åæ¥çèç¹å¼å 䏿æå¤§äºå®çèç¹å¼ä¹å
*/
public TreeNode convertBST(TreeNode root) {
convertBST(root, 0);
return root;
}
//使ç¨å
¨å±åé伿´å¥½çè§£ä¸äº
private int convertBST(TreeNode node, int current) {
if (node == null) {
return current;
}
current = convertBST(node.right, current);
current += node.val;
node.val = current;
return convertBST(node.left, current);
}
/*
* @description: 617.åå¹¶äºåæ
* @param: t1,t2: äºåæç´¢æ ç»ç¹
* @return: TreeNode:åå¹¶åçäºåæ æ ¹ç»ç¹
*/
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) {
return null;
}
TreeNode node = new TreeNode();
if (t1 == null) {
node.val = t2.val;
node.left = mergeTrees(null, t2.left);
node.right = mergeTrees(null, t2.right);
} else if (t2 == null) {
node.val = t1.val;
node.left = mergeTrees(t1.left, null);
node.right = mergeTrees(t1.right, null);
} else {
node.val = t1.val + t2.val;
node.left = mergeTrees(t1.left, t2.left);
node.right = mergeTrees(t1.right, t2.right);
}
return node;
}
/*
* @description: 628.ä¸ä¸ªæ°çæå¤§ä¹ç§¯
* @param: numsæ°ç»
* @return: ä¸ä¸ªæ°æå¤§ä¹ç§¯
*/
public int maximumProduct(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
}
/*
* @description: 637.äºåæ çå±å¹³åå¼
* @param: root:äºåæ æ ¹ç»ç¹
* @return: List:æ¯å±èç¹å¹³åå¼
*/
public List averageOfLevels(TreeNode root) {
List result = new ArrayList<>();
Map depthMap = new HashMap<>();
averageOfLevels(depthMap, root, 0);
for (int i = 0; i < depthMap.size(); i++) {
result.add(depthMap.get(i).getAverage());
}
return result;
}
private void averageOfLevels(Map map, TreeNode node, int depth) {
if (node != null) {
Entry entry = map.getOrDefault(depth, new Entry(0, 0.0));
entry.setCount(entry.getCount() + 1);
entry.setSum(entry.getSum() + node.val);
map.put(depth, entry);
averageOfLevels(map, node.left, depth + 1);
averageOfLevels(map, node.right, depth + 1);
}
}
/*
* @description: 645.é误çéå
* @param: numsæ°æ®ä»1-n
* @return: æ¾åºæ°ç»ä¸éå¤åç¼ºå¤±çæ°å
*/
public int[] findErrorNums(int[] nums) {
int n = nums.length;
boolean[] exist = new boolean[n + 1];
int num;
int errorNum = 0;
int errorSum = 0;
for (int i = 0; i < n; i++) {
num = nums[i];
errorSum += num;
if (exist[num]) {
errorNum = num;
} else {
exist[num] = true;
}
}
int sum = n * (n + 1) / 2;
errorSum = errorSum - errorNum;
int missNum = sum - errorSum;
return new int[]{errorNum, missNum};
}
/*
* @description: 844.æ¯è¾å«éæ ¼çå符串
* @param: S,T: å«ææ¨æ ¼ç¬¦'#'çå符串
* @return: boolean:è¿åSåTæ¯å¦ç¸ç,æ¨æ ¼ç¬¦ä¼å é¤åä¸ä¸ªå符
*/
public boolean backspaceCompare(String S, String T) {
if (S == null || T == null) {
return S == T;
}
int indexS = S.length() - 1, indexT = T.length() - 1;
int skipS = 0;
int skipT = 0;
while (indexS >= 0 || indexT >= 0) {
//å é¤å符,å®ä½å°éè¦æ¯è¾å°å符
while (indexS >= 0) {
if (S.charAt(indexS) == '#') {
skipS++;
indexS--;
} else {
if (skipS > 0) {
skipS--;
indexS--;
} else {
break;
}
}
}
while (indexT >= 0) {
if (T.charAt(indexT) == '#') {
skipT++;
indexT--;
} else {
if (skipT > 0) {
skipT--;
indexT--;
} else {
break;
}
}
}
//妿SåTé½è¿æå符就æ¯è¾SåTçå符
if (indexS >= 0 && indexT >= 0) {
if (S.charAt(indexS) == T.charAt(indexT)) {
indexS--;
indexT--;
} else {
return false;
}
} else {
//å½Sæè
Tå
¶ä¸ä¸ä¸ªå·²ç»æ²¡æå符äº
if (indexS >= 0 || indexT >= 0) {
return false;
}
}
}
return true;
}
/*
* @description: 968.çæ§äºåæ ,ç»å®ä¸ä¸ªäºåæ ,æä»¬å¨æ çèç¹ä¸å®è£
æå头ãèç¹ä¸çæ¯ä¸ªæå½±å¤´é½å¯ä»¥çè§å
¶ç¶å¯¹è±¡ãèªèº«åå
¶ç´æ¥å对象ã
* @param: root:äºåæ æ ¹ç»ç¹
* @return: int:çæ§ææç»ç¹éè¦çæå头æ°éæå°å¼
*/
public int minCameraCover(TreeNode root) {
//è¿éè¦èèæ ¹ç»ç¹çç¶æ
return minCamera(root) == 0 ? result + 1 : result;
}
/*
* @description: èªåºåä¸,ä»å·¦å³åæ çç¶ææ¥æ¨æå½åç»ç¹çç¶æ
* @return: 0-->æªçæ§,1-->è¢«çæ§,2-->å®è£
æå头
*/
private int minCamera(TreeNode node) {
if (node == null)
return 1;
//夿左å³åæ çç¶æ
int leftStatus = minCamera(node.left);
int rightStatus = minCamera(node.right);
//å·¦å³åæ 被è¦ç,说æå·¦å³åæ æ æå头,è¿æ¶è¯¥ç»ç¹å¤äºæªçæ§ç¶æ,è¿æ¯è®©ç¶ç»ç¹å»å®è£
æå头
if (leftStatus == 1 && rightStatus == 1)
return 0;
//å·¦å³åæ ææªè¢«çæ§ç,å½åç»ç¹å¿
é¡»è¦å®è£
æå头
//0 0 0 1 0 2 1 0 2 0
if (leftStatus == 0 || rightStatus == 0) {
result++;
return 2;
}
//å©ä½å¯è½æ§ä¸ºleftStatus == 2||rightStatus == 2,è¿æ¶ç¶ç»ç¹è¢«çæ§
return 1;
}
/*
* @description: åæOffer 35.夿é¾è¡¨çå¤å¶
* @param: head:é¾è¡¨å¤´
* @return: Node:æ·±æ·è´çé¾è¡¨
*/
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node copyNode = new Node(head.val);
Node cursor = copyNode;
Node headCursor = head;
Map nodeMap = new HashMap<>();
nodeMap.put(copyNode, head);
//é¦å
èµå¼next
while (headCursor.next != null) {
headCursor = headCursor.next;
cursor.next = new Node(headCursor.val);
cursor = cursor.next;
nodeMap.put(head, cursor);
}
headCursor = head;
cursor = copyNode;
//åå¤å¶random
while (headCursor != null) {
if (headCursor.random == null) {
cursor.random = null;
} else {
cursor.random = nodeMap.get(headCursor.random);
}
headCursor = headCursor.next;
cursor = cursor.next;
}
return copyNode;
}
/*
* @description: é¢è¯é¢ 01.01.å¤å®å符æ¯å¦å¯ä¸
* @param: astr:å符串
* @return: boolean:åç¬¦ä¸æ¯å¦ä¸å
å«éå¤çå符
*/
public boolean isUnique(String astr) {
int lowercase = 0;
int uppercase = 0;
for (int i = 0, l = astr.length(); i < l; i++) {
char c = astr.charAt(i);
int bit;
if (c >= 'a') {
bit = 1 << (c - 'a' + 1);
if ((bit & lowercase) == bit) {
return false;
} else {
lowercase |= bit;
}
} else {
bit = 1 << (c - 'A' + 1);
if ((bit & uppercase) == bit) {
return false;
} else {
uppercase |= bit;
}
}
}
return true;
}
/*
* @description: é¢è¯é¢ 01.02.å¤å®æ¯å¦äºä¸ºå符éæ
* @param: s1,s2:å符串
* @return: boolean:å符串s1ås2çå符æ¯å¦å®å
¨ç¸å
*/
public boolean CheckPermutation(String s1, String s2) {
if (s1 == null) {
return s2 == null;
}
if (s2 == null) {
return false;
}
if (s1.length() != s2.length()) {
return false;
}
int[] charNum = new int[128];
for (int i = 0, l = s1.length(); i < l; i++) {
charNum[s1.charAt(i)]++;
charNum[s2.charAt(i)]--;
}
for (int i = 0; i < 128; i++) {
if (charNum[i] != 0) {
return false;
}
}
return true;
}
/*
* @description: é¢è¯é¢ 01.03.URLå
* @param: S:å符串,length:å符串çå®é¿åº¦
* @return: String:å°ç©ºæ ¼æ¿æ¢ä¸º"%20"
*/
public String replaceSpaces(String S, int length) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < length; i++) {
char c = S.charAt(i);
if (c == ' ') {
result.append("%20");
} else {
result.append(c);
}
}
return result.toString();
}
/*
* @description: é¢è¯é¢ 01.04.åææå
* @param: s:å符串
* @return: boolean: å符串çå符æ¯å¦å¯ä»¥ç»æåæå符串
*/
public boolean canPermutePalindrome(String s) {
int[] charNum = new int[128];
for (int i = 0, l = s.length(); i < l; i++) {
charNum[s.charAt(i)]++;
}
int num = 0;
for (int i = 0; i < 128; i++) {
num += charNum[i] & 1;
if (num > 1) {
return false;
}
}
return true;
}
/*
* @description: é¢è¯é¢ 01.06.å符串å缩
* @param: S:å符ä»
å
å«a-z
* @return: String:å缩æå符æ°éçå½¢å¼,ä¾å¦aa-->a2,è¥å符串没æåç,è¿ååå§å符
*/
public String compressString(String S) {
if (S.length() == 0) {
return "";
}
StringBuilder result = new StringBuilder();
int count = 1;
for (int i = 0, l = S.length(); i < l - 1; i++) {
if (S.charAt(i + 1) == S.charAt(i)) {
count++;
} else {
result.append(S.charAt(i)).append(count);
if (result.length() >= S.length()) {
return S;
}
count = 1;
}
}
if (S.charAt(S.length() - 1) == S.charAt(S.length() - 2)) {
result.append(S.charAt(S.length() - 1)).append(count);
} else {
result.append(S.charAt(S.length() - 1)).append(count);
}
return result.length() < S.length() ? result.toString() : S;
}
}