【CodeTop】每日练习 2025.7.8
Leetcode 31. 下一个排列
从右向左找到第一个后续有更大值的元素,然后交换这个元素与更大值,从这个交换的位置直到末尾进行排序。
class Solution {public void nextPermutation(int[] nums) {int n = nums.length;int i = n - 2;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}if (i >= 0) {int j = n - 1;while (nums[j] <= nums[i]) {j--;}swap(nums, i, j);}reverse(nums, i + 1, n - 1);}private void swap (int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}private void reverse(int[] nums, int left, int right) {while (left < right) {swap(nums, left++, right--);}}
}
Leetcode 239. 滑动窗口最大值
单调队列模板题,比当前元素小的从尾部出队,超出范围的从队头出队。
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;int[] res = new int[n - k + 1];int[] queue = new int[n];int head = 0, tail = -1;for (int i = 0; i < n; i++) {while (head <= tail && nums[queue[tail]] <= nums[i]) {tail--;}queue[++tail] = i;if (queue[head] <= i - k) {head++;}if (i >= k - 1) {res[i - k + 1] = nums[queue[head]];}}return res;}
}
Leetcode 69. x 的平方根
二分答案法解决,开区间的写法容易确定返回值的情况。
class Solution {public int mySqrt(int x) {int left = 0;int right = Math.min(x, 46340) + 1;while (left + 1 < right) {int mid = left + ((right - left) >>> 1);if (mid * mid <= x) {left = mid;} else {right = mid;}}return left;}
}
Leetcode 32. 最长有效括号
括号匹配一般考虑用栈来解决,但这题用栈的逻辑反而有些反直觉,动态规划的做法更基础。
使用贪心算法则只需要统计左右括号的数量即可,容易记住。
class Solution {public int longestValidParentheses(String s) {int left = 0, right = 0, res = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {res = Math.max(res, 2 * right);} else if (right > left) {left = right = 0;}}left = right = 0;for (int i = s.length() - 1; i >= 0; i--) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {res = Math.max(res, 2 * left);} else if (left > right) {left = right = 0;}}return res;}
}
Leetcode 2. 两数相加
常规链表题,依次计算每位上的数值,注意处理进位和多余的数就可以。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummy = new ListNode();ListNode cur1 = l1, cur2 = l2, cur = dummy;int carry = 0, sum = 0;while (cur1 != null && cur2 != null) {sum = cur1.val + cur2.val + carry;cur.next = new ListNode(sum % 10);carry = sum / 10;cur1 = cur1.next;cur2 = cur2.next;cur = cur.next;}while (cur1 != null) {sum = cur1.val + carry;cur.next = new ListNode(sum % 10);carry = sum / 10;cur1 = cur1.next;cur = cur.next;}while (cur2 != null) {sum = cur2.val + carry;cur.next = new ListNode(sum % 10);carry = sum / 10;cur2 = cur2.next;cur = cur.next;}if (carry != 0) {cur.next = new ListNode(1);}return dummy.next;}
}