刷leetCode算法题+解析(七)

X的平方根

题目:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。

思路:这个题就是实现sqrt的功能,我审完题第一时间去找了Math的sqrt的实现,结果没找到。

刷leetCode算法题+解析(七)_第1张图片
image.png

刷leetCode算法题+解析(七)_第2张图片
image.png

所以很可惜,还是自己琢磨着写吧。逻辑什么的其实我目前的思路也很粗暴简单,总会有那么两个挨着的数,较小的平方小于X,较大的平方大于X,而这个X的平方因为是无条件舍去小数,所以X的平方就是较小的这个数。

接下来是实现的代码:这个题其实我觉得最难得不是实现,我就好像1累加到100,所有人都能做出来,但是是否简单就不一定了。我自己来回来去想方设法的简化,然后都没做到。

class Solution {
    public int mySqrt(int x) {
        int y = 0;
        while(y!=46340){
            if(y*y<=x && (y+1)*(y+1)>x){
                return y;
            }            
            y++;
        }
        return y;
    }  
}
class Solution {
    public int mySqrt(int x) {
        if(x<=1){
            return x==0?0:1;
        }     
        //最大也就这么大
        int max = 46340;
        if(x>=2147395600){
            return max;
        }  
        int min = 1;
        int result = 0;
        while(max-min<20){
            result=(min+max)/2;
            if(result*resultx){
                max = result;
            }else{
                return result;
            }    
        }
        for(int i=min;i<=max;i++){
            if(i*i<=x && (i+1)*(i+1)>x){
             return i;
            }
        }
        return -1;
    }
    
}

第一种简单粗暴,就是1一直加到一百的区别。第二种我自以为是用了二分法,然后执行效率和消耗内存狠狠地打了我脸,仍然差到离谱。


刷leetCode算法题+解析(七)_第3张图片
image.png

我已经放弃挣扎了,直接看大神的思路吧,我觉得我应该是哪里没想明白,整个思路不清楚。
好了,看完大神思路发现这个题可能真的就只能这么蠢了,不过我这里有个麻烦点就是人家很多用除法判断,我这里是平方比较的判断。

class Solution {
    public int mySqrt(int x) {
        if(x==1){
           return 1;
        }    
        int min = 0;
        int max = x;
        //当大和小只差一个数说明找对了,取较小值
        while(max-min>1){
            int result = (min+max)/2;
            if(x/result

这是大神的代码,我觉得可以写一本书,叫做论代码的精巧性。人家的代码,每一句都是有意义的。min从0开始,这样哪怕x是0也可以正常使用。然后如果x是1则下面的代码不起作用,因为是1不进入循环,那样返回值是min也就是0,所以这个1要提出来单独情况。剩下的所有的数字都可以按照逻辑走。
我具体这种算法叫什么不知道,但是应该属于二分法吧?反正就是起点终点,然后去中位数对比,大了大的值往小缩,小了小的值往大了缩。最后范围变成n和n+1,咱们需要的值就是这个较小的n。

爬楼梯

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:
    输入: 3
    输出: 3
    解释: 有三种方法可以爬到楼顶。
  3. 1 阶 + 1 阶 + 1 阶
  4. 1 阶 + 2 阶
  5. 2 阶 + 1 阶

思路:这道题我切切实实的看了快一天,因为真的数学基础相当于没有,人家都说是斐波那契数列问题,然后我看到的就是一串不知名的汉字。。再之后看题解,不太懂,再看,还是不太懂,问人+看题解,勉强有点懂,多看几个题解,差不多明白了。首先这个题你要这么想:如果是八节楼梯,有几种爬的方法:是爬七阶楼梯的方法+1阶楼梯 和 爬六阶楼梯的方法+2阶楼梯的和。首先如果明白了这一点,就很容易做出这道题了。就是累加嘛。同样道理,爬九阶楼梯 就是七阶楼梯方法加上八阶楼梯方法, 而十阶楼梯就是八阶+九阶。所以说这道题也可以看成是一个递归的问题。
但是偏偏这道题还真就不能这么算,因为会超出时间

刷leetCode算法题+解析(七)_第4张图片
测试40阶楼梯

如图,40阶楼梯的时候结果是正常的。
刷leetCode算法题+解析(七)_第5张图片
测试44阶楼梯

再如图,44阶楼梯,虽然也有结果了!但是执行用时2120ms,吓不吓人呦~
刷leetCode算法题+解析(七)_第6张图片
45阶楼梯

最后,最重要的45阶楼梯,递归的超出时间限制了。由此可见,这个单纯的直接递归是不能达成要求的。
另外关于这个为什么45是至关重要的呢?因为java返回值是int,如果n等于46会超出int最大值,所以n最大取值45.
咱们继续说,原理明白了,就是一个累加,然后不能直接递归,那就自己用代码来计算呗。直接上代码(因为我这个是先看了解析才做的,所以直接就是最终版,没有我自己的方法~)


class Solution {
    public int climbStairs(int n) {
        if(n<=2){
            return n;
        }
        //这个值是1指一个阶梯的时候是1,但是一会在循环中会改变
        int n1 = 1;
        //这个值是2指两个阶梯的时候是2,一会儿值会改变
        int n2 = 2;
        //这个从3开始才符合这个规律。所以i=2,保证肯定走了这个循环
        for(int i = 2;i

以上就是完整的方法,我注释写的很墨迹,并且表达能力有限,所以真的也就能写成这样了,都是我自己理解时候的想法,如果看了还不懂欢迎私信或者留言交流。

删除排序链表中的重复元素

题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3

这个题简单的不行,就不多说,直接上代码吧,因为我看性能消耗和执行时间都很满意了,所以也不看大神思路了

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //如果这个链表里没有元素则直接返回
        if(head==null){
            return head;
        }
        //因为这个循环要挪动指针的,所以要保存头节点head,用cur来移动指针。
        ListNode cur = head;
        while(cur.next!=null){
            //重复元素,则直接把下一个节点接上。
           if(cur.val==cur.next.val){
               cur.next = cur.next.next;
           }else{
               //确保不是重复元素才把指针往下挪
               cur=cur.next;
           }         
        }
        return head;
    }
}

就这样,这篇文章其实上周五就应该写完,但是当时因为卡在爬楼梯了,所以迟迟没完成,如果稍微帮到你了记得点个喜欢,点个关注哦,也祝大家工作顺顺利利!

你可能感兴趣的:(刷leetCode算法题+解析(七))