Leetcode日练笔记3 #278 #162 #153 First bad version & Find peak element & Find minimum in rotated array

本文探讨了二分查找算法在解决不同搜索问题中的应用,如找到第一个坏版本、峰值元素和旋转排序数组中的最小值。通过分析不同问题的解题思路,阐述了如何调整终止条件和中值选取策略来确保算法的正确性和效率。同时,文章提到了在某些情况下,微小的改动可能会影响运行时性能的微妙之处。

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

Template 2 是让最后一步只剩2个值,一个是left pointer,另一个是right pointer。如果不管哪个,若和目标值不一致,则两个pointer合并为一个,最后terminate while循环,并post process最后一个值是否与目标值同。不同则输出-1。

(Q:暂时没理解为啥和template 1 不同?先🐴)

# 278 First Bad Version

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

You are given an API bool isBadVersion(version) which returns whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

第一次写的:

# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:

class Solution:
    def firstBadVersion(self, n: int) -> int:
        l, r = 0, n
        while r - l > 1:
            mid = (l + r)//2
            if isBadVersion(mid):
                l = mid
            else:
                r = mid
        return r

submit之后说n = 2, bad =1的情况下不符。

发现是我的解法是,terminate的条件是最后剩两个值,左边是最后一个good version,右边是第一个bad version。但我这种思路是默认Left pointer所杵的位置一定是good version,right pointer所杵的位置是bad version。所以test case中一旦left pointer起始位置就是bad version,就会输出错误的结果。

只能换一种terminate方式。left 与right pointer 合为一个再输出。l = mid + 1。这样剩一个值的时候一定是我们要的first bad version的值。

改了之后的runtime:

sample solution:

本质没区别。不分析了。 

#162 Find Peak Element

A peak element is an element that is strictly greater than its neighbors.

Given an integer array nums, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks.

You may imagine that nums[-1] = nums[n] = -∞.

You must write an algorithm that runs in O(log n) time.

解题思路是最后剩一个值,这个值就是所求peak的index。

中值取法是左右标之和加1除以2,相当于最后剩两值时,mid与右标相等。

筛选条件是mid比左边的值大就挪left pointer至中值。反之则右标挪至中值左邻的位置。

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        l, r = 0, len(nums)-1
        while r > l:
            mid = (r+l+1)//2
            if nums[mid] > nums[mid-1]:
                l = mid
            else:
                r = mid - 1
        return l

 runtime:

 sample:

中值少了+1一步。不过改了之后

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        l, r = 0, len(nums)-1
        while r > l:
            mid = (r+l)//2
            if nums[mid] > nums[mid+1]:
                r = mid
            else:
                l = mid + 1
        return l

反而更慢了。比较玄学……

算了,以后sample解法相差不大的就不分析也不提了。

#153 Find Minimum in Rotated Sorted Array

解题思路:

不考虑rotated了多少次,只判断最小值在中值左边还是右边。判别方法,中值与尾值比大小:> 则在右边。反之则反。最后terminate的condition是左标右标合一,最后剩最小值。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        l, r = 0, len(nums)-1
        while r > l:
            mid = (l + r)//2
            if nums[mid] > nums[-1]:
                l = mid + 1
            else:
                r = mid
        return nums[l]

runtime:

 和31ms的解法一样。就不分析了。

<think>好的,我现在需要帮助用户找到LeetCode中的第1题和第3题的链接,并确认它们属于哪个题库。首先,用户之前询问了关于转岗开发的学习计划,其中提到了LeetCode的题目编号,现在用户想知道这些题目的具体链接和所属题库。 首先,我需要回忆LeetCode的题目编号系统。LeetCode的题目是按照提交时间顺序编号的,所以题号是连续的。第1题通常是Two Sum,第3题是Longest Substring Without Repeating Characters。不过,用户可能会混淆不同的题库,比如中文版的力扣(LeetCode China)是否有不同的编号,但通常国际版和中文版的题目编号是一致的,只是标题翻译成中文。 接下来,我需要确认用户提到的题目是否确实是这两个。根据常见的LeetCode高频题目,这两个题号对应的题目是正确的。所以需要给出对应的链接。国际版和中文版的链接不同,用户可能在使用中文版,所以需要同时提供两种链接,或者询问用户是否需要中文版的链接。不过根据用户的工作背景,可能更倾向于国际版,但为了全面,应该都提供。 另外,用户可能不太清楚题目的具体内容,需要简要描述题目内容,以便用户理解为什么要刷这些题。例如,Two Sum是数组和哈希表的应用,而第三题涉及滑动窗口或双指针技巧,这些在车机开发中处理数据或算法时可能会用到。 还需要检查链接是否正确,避免给出错误的链接。例如,国际版的第1题链接是https://leetcode.com/problems/two-sum/,而中文版的是https://leetcode.cn/problems/two-sum/。同样的,第三题的国际版链接是https://leetcode.com/problems/longest-substring-without-repeating-characters/,中文版是https://leetcode.cn/problems/longest-substring-without-repeating-characters/。 另外,用户可能想知道这些题目属于哪个分类,比如数组、哈希表、字符串等,这样他们可以更有针对性地练习。例如,Two Sum属于数组和哈希表,第三题属于字符串和滑动窗口。 最后,需要确保回答清晰,结构合理,使用用户容易理解的语言,避免技术术语过多,同时保持专业性。可能需要用列表或格式化的方式呈现信息,让用户一目了然。 总结一下,回答需要包含以下几点: 1. 题目编号对应的题目名称。 2. 题目所属的LeetCode题库(国际版和中文版)。 3. 每个题目的简要描述和考察重点。 4. 对应的链接。 5. 解释为什么选择这些题目,与用户的学习计划相关。 现在需要将这些信息组织成自然的中文回答,确保准确性和有用性。</think>以下是LeetCode相关题目的详细信息整理: --- ### **LeetCode题目定位说明** #### **1. LeetCode #1** - **国际版标题**:`Two Sum` - **中文版标题**:`两数之和` - **所属分类**:数组 + 哈希表 - **题目链接**: - 国际版:https://leetcode.com/problems/two-sum/ - 中文版:https://leetcode.cn/problems/two-sum/ - **考察重点**: - 利用哈希表实现$O(n)$时间复杂度 - 数据索引与值的关系映射(车机开发中常用于状态快速查询) #### **2. LeetCode #3** - **国际版标题**:`Longest Substring Without Repeating Characters` - **中文版标题**:`无重复字符的最长子串` - **所属分类**:滑动窗口 + 字符串 - **题目链接**: - 国际版:https://leetcode.com/problems/longest-substring-without-repeating-characters/ - 中文版:https://leetcode.cn/problems/longest-substring-without-repeating-characters/ - **考察重点**: - 滑动窗口算法(车机轨迹线动态规划中常用类似思想) - 边界条件处理(与实时系统开发中的异常场景处理高度相关) --- ### **为什么选择这两题?** 1. **高频面试题**:90%以上车企/Tier1开发岗必考题型 2. **技能迁移性**: - `Two Sum` → 车机传感器数据匹配(如雷达点云快速索引) - `最长子串` → 视图系统事件流分析(如触控手势连续性判断) --- ### **题库版本说明** - **国际版**:题目更新更快,社区讨论更活跃(推荐优先使用) - **中文版**:题目描述为中文,适合英语阅读有障碍时参考 --- ### **下一步建议** ```mermaid graph TD A[完成题目] --> B[提交通过] B --> C{是否理解最优解?} C -->|是| D[尝试用C++11特性重构] C -->|否| E[参考官方题解] D --> F[关联Effective C++条款] F --> G[例如Item3: const优化变量声明] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值