day8(力扣)猜数字大小(python描述)

本文深入探讨了猜数字游戏中的暴力循环与二分查找算法。通过对比两种方法,揭示了二分查找在效率与存储方面的优势,同时提出了暴力法失败的原因猜测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:我们正在玩一个猜数字游戏。 游戏规则如下:我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。每次你猜错了,我会告诉你这个数字是大了还是小了。你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-1,1 或 0):

-1 : 我的数字比较小
 1 : 我的数字比较大
 0 : 恭喜!你猜对了!

示例 :

输入: n = 10, pick = 6
输出: 6

分析:说实话,虽然没看懂题目的 pick 和 n 到底代表着什么 ,但是一看他提供的内置函数小编嘴角微微上扬,因为这个可以直接暴力循环,当guess函数返回为 0 的时候肯定就是猜中了,直接返回答案就行,于是就有了下面戏剧性的一幕。
在这里插入图片描述
小编当时还没反应过来,这是什么情况????后来冷静了一下,想了想,这是不是溢出了,或者是数字的类型不够长,存储不下了。于是小编就想起了当时C语言最常用的对付这一类查找的算法:二分查找,试试看到底是哪里出了问题。代码如下:

# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num):

class Solution(object):
    def guessNumber(self, n):
    
     #   :type n: int
     #   :rtype: int

        low = 0
        high = n
        while low <= high:
            mid = (high - low) / 2 + low
            if guess(mid) == 0:
                return mid
            elif guess(mid) == 1:
                low = mid + 1
            else: 
                high = mid - 1

二分法很简单,假如你要处理的对象是一个数组,你要找到数组中的一个元素,我们可以采用对半分的思想,定义起始点:数组的第一个元素的位置(low)终点:数组最后一个元素的位置(high)中间点:(终点位置 - 起始点位置) / 2 + 起始点位置 (mid),如果猜的数字比中间的数字大,我们就把起始点移动到中间点右边第一个点的位置;如果猜的数字比中间点小,我们就把终点移动到中间点左边第一个点的位置;如此往复,直到终点跑到了起始点的左边(当二者位置相同的时候仍要继续比较,否则你就会少比较而这相同位置的这个点的值)。
虽然采用二分法之后提交就直接通过,但是小编仍然不知道为什么暴力法不行,如果是时间超出限制,他会提示时间超出限制,但是他给出的错误提示是答案错误。如果是数字存储问题,那么为什么二分法就可以存储的下这么大的数字而暴力法不可以呢???如果可以回答小编这个问题的话欢迎下边评论。

### 力扣热题 HOT 100 中与 Python 相关的题目及解决方案 力扣(LeetCode)上的热门题目列表——HOT 100 是许多开发者练习算法和数据结构的重要资源。以下是几个典型的 HOT 100 题目及其对应的 Python 解决方案概述。 #### 两数之和 (Two Sum) 这是一个经典的入门级问题,目标是从给定数组中找到两个数,使它们相加等于指定的目标值。可以通过哈希表来优化查找过程[^2]。 ```python def twoSum(nums, target): hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i ``` #### 最长连续序列 (Longest Consecutive Sequence) 此问题是关于如何高效地找出未排序整数数组中最长的连续元素序列。可以利用集合的数据结构特性实现 O(n) 时间复杂度的解决方法[^3]。 ```python def longestConsecutive(nums): nums_set = set(nums) max_length = 0 for num in nums_set: if num - 1 not in nums_set: current_num = num current_streak = 1 while current_num + 1 in nums_set: current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length ``` #### 字符串中的所有字母异位词 (Find All Anagrams in a String) 该问题要求在一个较长字符串中定位所有的短字符串的字母排列位置。滑动窗口技术配合字符计数能够有效解决问题。 ```python from collections import defaultdict def findAnagrams(s, p): result = [] need = defaultdict(int) window = defaultdict(int) for c in p: need[c] += 1 left = right = valid = 0 start = length = 0 while right < len(s): c = s[right] right += 1 if c in need: window[c] += 1 if window[c] == need[c]: valid += 1 while right - left >= len(p): if valid == len(need): result.append(left) d = s[left] left += 1 if d in need: if window[d] == need[d]: valid -= 1 window[d] -= 1 return result ``` #### 和为 K 的子数组 (Subarray Sum Equals K) 这个问题涉及计算一个数组中有多少个连续子数组其元素总和恰好等于 k 值。通过前缀和以及字典存储中间状态可达到线性时间效率。 ```python def subarraySum(nums, k): count = total_sum = 0 sums_dict = {0: 1} for num in nums: total_sum += num if (total_sum - k) in sums_dict: count += sums_dict.get(total_sum - k, 0) sums_dict[total_sum] = sums_dict.get(total_sum, 0) + 1 return count ``` 以上仅展示了部分 HOT 100 列表内的经典习题及其基于 Python 实现的核心逻辑。更多具体案例可通过链接访问官方文档获取进一步学习资料[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值