z08_374.猜数字大小

一、题目

二、想法

三、复杂度分析

四、优秀解法

五、学到了什么


一、题目

374. 猜数字大小
https://leetcode-cn.com/problems/guess-number-higher-or-lower/

二、想法

1.猜数字,隐形中也是对有序整形数组进行大小比较,所以可以进行二分查找算法,加快查找速率

        /**
         * 猜数字,隐形中也是对有序整形数组进行大小比较,所以可以进行二分查找算法,加快查找速率
         */
        fun guessNumber(n:Int):Int {
            var left = 1
            var right = n
            while(left <= right) {
                val mid = left + (right - left) / 2
                val result = guess(mid)
                if (result == 0) {
                    return mid
                } else if (result == 1) {
                    left = mid + 1
                } else {
                    right = mid - 1
                }
            }

            return -1
        }

三、复杂度分析

时间复杂度:O(logN), 每次循环都会丢弃一半的查找空间
空间复杂度:O(1), 使用一个整数型变量mid来记录中间值

四、优秀解法

        /**
         * 三分查找法
         * 但是最坏情况下复杂度比二分查找算法高,不推荐使用
         */
        fun guessNumber(n: Int): Int {
            var low = 1
            var high = n
            while(low <= high) {
                val mid1 = low + (high - low)/3
                val mid2 = high - (high - low)/3
                val res1 = guess(mid1)
                val res2 = guess(mid2)

                if (res1 == 0) {
                    return mid1
                } else if (res2 == 0) {
                    return mid2
                } else if (res1 < 0) {
                    high = mid1 -1
                } else if (res2 > 0) {
                    low = mid2 + 1
                } else {
                    low = mid1 + 1
                    high = mid2 -1
                }
            }

            return -1
        }

五、学到了什么

1. 本来是mid跟目标值进行比较,题目是将目标值封装到了一个guess()函数中,所以是一个简单的二分查找算法题目变换问题
2. 三分查找算法:就是分隔成3段,可以有2个隔断点进行比较,然后对2个隔断间比较大小,再确定是在3段中的那一段,但是最坏情况下时间复杂度比二分查找算法高,不推荐使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值