今天是一道查找范围的题,我做得特别恶心才做出来;启发是多记写好的库和函数,😭
1.开始准备同时找上下界,后来各种Corner case通不过于是就分开找上下界
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if len(nums)==0:
return [-1,-1]
elif len(nums)==1:
if nums[0]==target:
return [0,0]
else:
return [-1,-1]
ret=[-1,-1]
up=len(nums)
down=0
index=int(len(nums)/2)
temp=nums[index]
count=0
while(up-down>0):
if temp==target:
if index==len(nums)-1 or nums[index+1]!=target:
ret[1]=index
up=index
break
else:
index+=1
elif target<temp:
up=index
index=int(down+(up-down)/2)
else:
down=index
index=int(down+(up-down)/2)
temp=nums[index]
if up-down==1 and ret[1]==-1:
if count==0:
count+=1
else:
break
up=len(nums)
down=0
index=int(len(nums)/2)
temp=nums[index]
while(ret[1]!=-1):
if temp==target:
if index==0 or nums[index-1]!=target:
ret[0]=index
down=index
break
else:
index-=1
elif target<temp:
up=index
index=int(down+(up-down)/2)
else:
down=index
index=int(down+(up-down)/2)
temp=nums[index]
return ret
2.发现有一个博主写的特别简单,见链接【python/M/34】Find First and Last Position of Element in Sorted Array
关键点在于找到值以后向前后搜寻上下界
class Solution:
def searchRange(self, nums, target):
length = len(nums)
if length == 0:
return [-1,-1]
if nums[0] <= target and nums[-1] >= target:
left,right = 0,length-1
while left <= right:
mid = (left+right) // 2
if nums[mid] == target:
right = left = mid
while left-1 >= 0 and nums[left-1] == target:
left -= 1
while right+1 <= length-1 and nums[right+1] == target:
right += 1
return [left,right]
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return [-1,-1]
3.然后发现c++的upper_bound,lower_bound和python的bisect简直是为此而生的,就非常懊悔,见链接【LeetCode】34. Find First and Last Position of Element in Sorted Array 解题报告(Python & C++)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
auto low = lower_bound(nums.begin(), nums.end(), target);
auto high = upper_bound(nums.begin(), nums.end(), target);
if (low == high) return {-1, -1};
return {low - nums.begin(), high - nums.begin() - 1};
}
};
class Solution(object):
def searchRange(self, nums, target):
left = bisect.bisect_left(nums, target)
right = bisect.bisect_right(nums, target)
if left == right:
return [-1, -1]
return [left, right - 1]
当事人现在就是后悔,非常得后悔,发现掉bisect和自己写出来时间空间复杂度差不多。你不掉包你用Python做鬼啊(微笑)。
希望之后能整理一下这些算法常用函数。