LeetCode Hot100 刷题笔记(9)—— 二分查找、技巧

目录

前言

一、二分查找

1. 搜索插入位置

2. 搜索二维矩阵

3. 在排序数组中查找元素的第一个和最后一个位置

4. 搜索旋转排序数组

5. 寻找旋转排序数组中的最小值

6. 寻找两个正序数组的中位数

二、技巧

1. 只出现一次的数字

2. 多数元素

3. 颜色分类

4. 下一个排列

5. 寻找重复数


前言

一、二分查找:搜索插入位置,搜索二维矩阵,在排序数组中查找元素的第一个和最后一个位置,搜索旋转排序数组,寻找旋转排序数组中的最小值,寻找两个正序数组的中位数。

二、技巧:只出现一次的数字,多数元素,颜色分类,下一个排列,寻找重复数。


一、二分查找

1. 搜索插入位置

原题链接:35. 搜索插入位置 - 力扣(LeetCode)

# 解法(1)
class Solution(object):
    def searchInsert(self, nums, target):
        if target in nums:
            return nums.index(target)
        else:
            nums.insert(0, float('-inf'))
            nums.insert(len(nums), float('inf'))
            for i, n in enumerate(nums):
                if nums[i] < target and nums[i+1] > target:
                    return i

# 解法(2)
class Solution(object):
    def searchInsert(self, nums, target):
        for k,v in enumerate(nums):
            if target<=max(nums):
                if v<target:
                    continue
                return k
            else:
                return len(nums)

2. 搜索二维矩阵

原题链接:74. 搜索二维矩阵 - 力扣(LeetCode)

class Solution(object):
    def searchMatrix(self, matrix, target):
        matrix = sum(matrix, [])
        if target in matrix:
            return True
        return False

3. 在排序数组中查找元素的第一个和最后一个位置

原题链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

# 解法(1)
class Solution(object):
    def searchRange(self, nums, target):
        if target not in nums:
            return [-1, -1]
        else:
            left = nums.index(target)
            nums.sort(reverse=True)
            right = len(nums)- nums.index(target) - 1 
            return [left, right]

# 解法(2)
class Solution(object):
    def searchRange(self, nums, target):
        lst = []
        for k,v in enumerate(nums):
            if v==target:
                lst.append(k)
        if not lst:
            lst = [-1,-1]
        return [min(lst), max(lst)]

4. 搜索旋转排序数组

原题链接:33. 搜索旋转排序数组 - 力扣(LeetCode)

class Solution(object):
    def search(self, nums, target):
        if target in nums:
            return nums.index(target)
        else:
            return -1

5. 寻找旋转排序数组中的最小值

原题链接:153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

class Solution(object):
    def findMin(self, nums):
        return min(nums)

6. 寻找两个正序数组的中位数

原题链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        num = nums1 + nums2
        num.sort()
        ln = len(num) 
        if ln % 2 == 0:
            mid = (num[ln//2-1] + num[ln//2]) / 2.0
        else:
            mid = num[ln//2]
        return mid

二、技巧

1. 只出现一次的数字

原题链接:136. 只出现一次的数字 - 力扣(LeetCode)

# 解法(1)
class Solution(object):
    def singleNumber(self, nums):
        return sum(set(nums))*2 - sum(nums)

# 解法(2)
class Solution(object):
    def singleNumber(self, nums):
        from collections import Counter
        cnt = Counter(nums)
        for k, v in cnt.items():
            if v == 1:
                return k

2. 多数元素

原题链接:169. 多数元素 - 力扣(LeetCode)

# 解法(1)
class Solution(object):
    def majorityElement(self, nums):
        nums.sort()
        return nums[len(nums)//2]

# 解法(2)
class Solution(object):
    def majorityElement(self, nums):
        from collections import Counter
        cnt = Counter(nums)
        for k, v in cnt.most_common(1):
            return k

3. 颜色分类

原题链接:75. 颜色分类 - 力扣(LeetCode)

class Solution(object):
    def sortColors(self, nums):
        return nums.sort()   

4. 下一个排列

原题链接:31. 下一个排列 - 力扣(LeetCode)

class Solution(object):
    def nextPermutation(self, nums):
        # [4,5,2,6,7,3,1]   先找2,在找3

        i = len(nums) - 1
        while i>0 and nums[i-1] >= nums[i]:
            i -= 1 

        j = len(nums) - 1
        while i > 0 and nums[j] <= nums[i-1]:
            j -= 1

        nums[i-1], nums[j] = nums[j], nums[i-1]
        nums[i:] = sorted(nums[i:])

5. 寻找重复数

原题链接:287. 寻找重复数 - 力扣(LeetCode)

# 解法(1)
class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        from statistics import mode
        return mode(nums)

# 解法(2)
class Solution(object):
    def findDuplicate(self, nums):
        from collections import Counter
        cnt = Counter(nums)
        for k, v in cnt.most_common(1):
            return k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值