在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
思路:主要是使用二分法,用target和中间的数进行比较,如果mid大于target,那么结果一定在左边,反之亦然,每一次可以将范围缩小一半。具体的思路:在left和right中,让left找到刚刚小于target的坐标,将该坐标+1返回则是左边的边界值,让right找到刚刚大于target的坐标,并将该坐标-1即是右边的边界值:
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ left = self.seacher(nums, target) right = self.seacher(nums, target+1) # 右边的复用了左边查找的方法,将目标值+1,即参照比 if left < right: # 目标值大1的数,mid刚好就是target,而多加了1 return [left, right - 1] # 由于返回的right多加了1,所以减去了 else: return [-1, -1] def seacher(self, nums, target): left = 0 right = len(nums) # 左开右闭,所以不需要-1 while left < right: mid = left + (right - left) // 2 # 找到中间的数 if nums[mid] < target: # 找到left刚好小于target的下标 left = mid +1 # +1返回则是边界值 else: right = mid return left
三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
思路:排序+双指针法,由于不能重复,需要排除可能重复的
1、当i >0时,总结果一定大于0 ,直接break
2、当前一个数据和后一个数据相等的时候,pass,以免引起数据的重复
3、数据为空或者长度小于3的时候,直接返回
在循环的时候,也要注意双指针的排除重复项
class Solution(object): def threeSum(self, nums): lens = len(nums) res = [] nums.sort() if not nums or lens < 3: #数据为空或者长度小于3的时候,直接返回 return res else: for i in range(lens): if nums[i] > 0: # 当i >0时,总结果一定大于0 ,直接break return res if i > 0 and nums[i] == nums[i - 1]: #跳过前一个数据和后一个数据相等的时候 continue l = i + 1 r = lens - 1 while l < r: # 双指针条件 if nums[i] + nums[l] + nums[r] == 0: # 等于0直接加进列表 res.append([nums[i], nums[l], nums[r]]) while l<r and nums[l] == nums[l + 1]: # 同理,排除双指针重复项 l += 1 while l<r and nums[r] == nums[r - 1]: r -= 1 l += 1 r -= 1 elif nums[i] + nums[l] + nums[r] > 0: # 当和>0,为了降低数据,r向左移 r -= 1 else: # 当和<0,为了增大数据,l向右移 l += 1 return res