力扣不能断啊 154 -164

哈哈哈哈  不是10道题 而是很多题被锁了 

 

154: 寻找旋转数组的最小值 

 

因为之前好像见过类似的 知道是二分 

找有序段 

left mid right n minnum 我也只有这五个变量名啊 而且都是必须的好嘛。
结果空间被百分之95的人击败
时间击败了72的人 还行吧。

下面说说思路 就是二分法嘛
我感觉已经摸到了二分法的精髓
就是看左右端点值 和中间值的情况 做出区间的改变。

中间和两端比较 有几种情况呢 ? 9种啊 3*3嘛

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left = 0
        n = len(nums)
        right = n-1
        while left <= right:
            mid = (left +right) //2
            if mid == n-1 or mid == 0:
                return min(nums[left],nums[right])
            if nums[mid] < nums[mid+1] and nums[mid] < nums[mid-1]:
                return nums[mid]
            if nums[mid] > nums[left]:       #当大于左端点时
                if nums[mid] > nums[right]:            # 大左 又 大右 说明最小值在右边
                    left = mid + 1
                else:                                  #大于左边 但是小于等于右边  说明最小值就是最左边的值
                    return nums[left]
            elif nums[mid] == nums[left]:    #当等于左端点时。
                if nums[mid] > nums[right]:            # 等左 又 大右 说明最小值在右边
                    left = mid + 1
                elif nums[mid] == nums[right]:         # 等左 又 等右 没法判断 遍历吧。
                    minnum = nums[left]
                    for i in range(left,right+1):
                        if minnum > nums[i]:
                            minnum = nums[i]
                    return minnum
                else:                                  #等于左边 但是小于右边  说明最小值就是最左边的值  
                    return nums[left]
            else:                            #当小于左端点时。
                right = mid                            #此时不可能大于右端点,
                                                       #小左又小于等于右时,只能是左边 或者就是mid本身。




作者:yizhu-jia
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/solution/wo-bu-li-jie-wei-shi-yao-wo-de-kong-jian-22e8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

155: 最小栈 

难点在于pop实现 我懒了 无脑的找 

 

class MinStack:

    def __init__(self):
        self.stack = []
        self.minNum = float('inf')

    def push(self, val: int) -> None:
        self.stack.append(val)
        if val < self.minNum:
            self.minNum = val

    def pop(self) -> None:
        topNum = self.stack.pop()
        if topNum == self.minNum:
            minNum = float('inf')
            for each in self.stack:
                if each < minNum:
                    minNum = each
            self.minNum = minNum
        return topNum

    def top(self) -> int:
        topNum = self.stack[-1]
        return topNum

    def getMin(self) -> int:
        return self.minNum



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/min-stack/solution/zen-yao-shi-xian-pop-ni-xuan-de-shi-zui-tnisw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

160: 很多题被锁了 沃日 

相交链表 

先找到长度差 

然后让长的那个先走长度差 的长度 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        def listLen(head):
            num = 0 
            while head != None:
                head = head.next
                num  += 1
            return num
        


        diff = listLen(headA) - listLen(headB)
        if diff > 0 :
            p = headA
            q = headB
        else:
            p = headB
            q = headA           #p是长的那个
        diff =abs(diff)
        while diff > 0 :
            p = p.next
            diff -= 1
            
        while  p != None :
            if p == q:
                return p            
            p = p.next
            q = q.next

        return None
        

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/hao-duo-ti-bei-suo-liao-can-nian-by-yizh-2rs7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

162 寻找峰值 

特殊情况比较麻烦 

但是看到时间复杂度就应该想到二分法
二分法就是找结果可能在的区间。
就是比较三个点的值。
当中间 大于左 小于右 结果肯定在左边
大于左 大于右 结果不确定 要再看两个点 左中点 和右中点 如果正中点大于两边两个中点 说明结果在左右中点之间
如果正中点小于哪一边 说明解就在哪一边
小于左 大于右 在右边
小于左 小于右 左右都有解

get 判断比较麻烦 等号一定是加在大于等于左上 因为向下取整很容易出现mid = left 的情况

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return 0
        left = 0
        right = n-1
        while left <= right:
            mid = (left + right )//2
            if mid == 0 :
                if nums[0] > nums[1]:
                    return 0
                else:
                    return 1
            if mid == n-1:
                if nums[mid] > nums[mid-1]:
                    return n-1
                else:
                    return n-2
            if nums[mid] > nums[mid-1] and nums[mid] > nums[mid+1]:
                return mid
            if nums[mid] >= nums[left] :
                if nums[mid] > nums[right]:
                    lmid = (mid + left) //2
                    rmid = (mid + right) //2
                    if nums[lmid] > nums[mid]:
                        right = mid-1
                    elif nums[rmid] > nums[mid]:
                        left = mid + 1
                    else:
                        left = lmid
                        right = rmid
                else:
                    left = mid +1
            else:
                right = mid -1

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/find-peak-element/solution/ai-er-fen-fa-jiu-shi-te-shu-qing-kuang-n-rxjw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

164 最大间距 好家伙 我只接sorted排序 

 

class Solution:
    def maximumGap(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return 0
        nums = sorted(nums)
        rel = float('-inf')
        for i,each in enumerate(nums[1:]):
            if each - nums[i] > rel:
                rel = each - nums[i]
        return rel 


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/maximum-gap/solution/sorted-by-yizhu-jia-sw82/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2022-03-12 11:18  yi术家  阅读(38)  评论(0编辑  收藏  举报