leecode128,最长连续子序列,哈希表枚举,要注意技巧,判断num-1是否在哈希表中,可以降低时间复杂度。
class Solution: def longestConsecutive(self, nums: List[int]) -> int: nums_set = set(nums) long_path = 0 for num in nums_set: if num-1 not in nums_set: current_num = num current_path = 1 while current_num + 1 in nums_set: current_num += 1 current_path += 1 long_path = max(long_path,current_path) return long_path
旋转数组
leecode33,搜索旋转数组,二分后两边子数组一个有序一个无序,在有序的那一边继续搜索。但是要考虑重复数字的存在。
class Solution: def search(self, nums,target: int) -> int: if len(nums) == 0: return -1 if len(nums) == 1: if nums[0] == target: return 0 else: return -1 l = 0 r = len(nums) while l < r: mid = (l+r)//2 if nums[mid] == target: return mid if nums[l] == nums[mid] and nums[r-1] == nums[mid]: l += 1 r -= 1 elif nums[l]<=nums[mid]: if nums[l]<=target<=nums[mid]: r = mid else: l = mid + 1 else: if nums[mid]<=target<=nums[r-1]: l = mid + 1 else: r = mid return -1
leecode81,旋转数组,leecode38加强版,有重复数字,难以判断子数组哪个有序,所以碰到nums[l],nums[mid],nums[r-1]三数字相等时,l和r分别加减1
class Solution: def search(self, nums,target: int) -> int: if len(nums) == 0: return -1 if len(nums) == 1: return nums[0] == target l = 0 r = len(nums) while l < r: mid = (l+r)//2 if nums[mid] == target: return True if nums[l] == nums[mid] and nums[r-1] == nums[mid]: l += 1 r -= 1 elif nums[l]<=nums[mid]: if nums[l]<=target<=nums[mid]: