文章目录
70. 爬楼梯【简单】
https://leetcode-cn.com/problems/climbing-stairs/
class Solution {
public int climbStairs(int n) {
if (n < 3) return n;
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
剑指 Offer 22. 链表中倒数第k个节点【简单】
https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
快慢指针 一个指针先走k
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow = head, fast = head;
for (int i = 0; i < k; i++) {
fast = fast.next;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
19. 删除链表的倒数第 N 个结点【中等】
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode slow = dummy, fast = dummy;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
ListNode tmp = slow.next.next;
slow.next = tmp;
return dummy.next;
}
}
56. 合并区间【中等】
https://leetcode-cn.com/problems/merge-intervals/
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length < 2) return intervals;
Arrays.sort(intervals, (o1,o2)->(o1[0] - o2[0]));
List<int[]> res = new ArrayList<>();
int start = intervals[0][0];
int len = intervals.length;
for (int i = 1; i < len; i++) {
if (intervals[i][0] > intervals[i-1][1]) {
res.add(new int[] {start, intervals[i-1][1]});
start = intervals[i][0];
}
else {
if (intervals[i][1] < intervals[i-1][1]) {
intervals[i][1] = intervals[i-1][1];
}
}
}
res.add(new int[]{start, intervals[len-1][1]});
return res.toArray(new int[res.size()][2]);
}
}
69. x 的平方根【简单】
https://leetcode-cn.com/problems/sqrtx/
二分法
思路分析
因此我们可以使用「二分查找」来查找这个整数,不断缩小范围去猜。
很容易知道,题目要我们返回的整数是有范围的,直觉上一个整数的平方根肯定不会超过它自己的一半,但是 0 和 1 除外,因此我们可以在1 到输入整数除以 2 这个范围里查找我们要找的平方根整数。0 单独判断一下就好。
class Solution {
public int mySqrt(int x) {
int left = 1, right = x/2;
if (x == 0 || x == 1) return x;
while(left < right) {
int mid = left + (right - left + 1) / 2;
if (x/mid == mid) {
return mid;
}
else if (x/mid > mid) {
left = mid;
}
else if (x/mid < mid) {
right = mid - 1;
}
}
return left;
}
}