[七日打卡]之第六卡:x的平方根、爬楼梯、删除排序链表中的重复元素

144 阅读2分钟

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;
    }
}

今天就到这里吧~~