X的平方根
这个题真是毫无头绪,不知道怎么解答。
看了官方的解答思路,方法一和方法三感觉已经还给老师了,只有方法二还能看懂。
之前以为二分查找是用来在已排序的数组中查找目标值,没想到也可以用在这里。
二分查找的思路这里不再赘述,需要注意的是:mid * mid 的值可能会超出int的取值范围,需要转为long型再进行比较。
class Solution {
public int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1;
while (left <= right) {
int mid = (right - left) / 2 + left;
if ((long) mid * mid <= x) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
}
爬楼梯
首先,我承认,我写了递归,然后信心满满的提交代码,果然,当楼梯数n超过一定数字之后,执行超出时间限制,被打脸了,LeetCode不可能这么简单,脸被打的啪啪响!!!
看了官方的题解,给出的公式:f(n) = f(n-1) + f(n-2),然后给出了滚动数组的解法。。。懵,上次递归你也是这个公式。。。
好吧,那学习一下吧,首先定义三个元素,a、b、c,在滚动的时候,将b和c的值向前移动,然后将b、c的和赋予c,其实这里看官方的动画更好理解。
class Solution {
public int climbStairs(int n) {
int a = 0;
int b = 0;
int c = 1;
for (int i = 1; i <= n; i++) {
a = b;
b = c;
c = a + b;
}
return c;
}
}
删除排序链表中的重复元素
思路:
这道题看着不难,思考起来也不是很费劲,就是一个操作指针指向的问题。
首先我们需要确定的是遍历链表的方法,是使用while而不是for。
其次,while循环的条件是当前元素不为null并且当前元素的下一个元素也不为null。
在遍历的过程中,我们需要作出的操作就是,如果当前元素的值的下一个元素的值相同,我们需要将当前元素的next指向下下一个元素。
如果当前元素的值与下一个元素的值不同,那么我们就跳过当前元素,去判断下一个元素。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode c = head;
while (c != null && c.next != null) {
if (c.next.val == c.val) {
c.next = c.next.next;
} else {
c = c.next;
}
}
return head;
}
}
今天就到这里吧~~