一堆负数+一堆0+一堆正数
找最后一个出现的负数和第一个出现的正数的下标 下标从1开始
果然没运行看不出哪里错了 555
def findnum(nums):
res = []
for i in range(len(nums)):
# 如果全是0 边界
if nums[0] == 0 and nums[-1] == 0:
return 0, 0
# 记录0的下标
elif nums[i] == 0:
# 因为数字从下标1开始
res.append(i + 1)
elif nums[i] > 0:# 找到正数跳出循环
break
print(res)
return res[0] - 1, res[-1] + 1
nums = [-3, -4, -1, 0, 0, 0, 0, 1, 2, 3, 6]
print(findnum(nums))
nums = [0, 0, 0, 0, 1, 2, 3, 6]
print(findnum(nums))
nums = [0, 0, 0, 0]
print(findnum(nums))
二分 找第一个0和最后一个0的位置 然后他们前面各一位就是要找的下标
class Solution():
def find_left(self, nums):
l = 0
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == 0:
r = mid - 1
elif nums[mid] > 0:
r = mid - 1
else:
l = mid + 1
# 第一个0,l>right = mid -1 l=mid
# 下标从1开始
return l + 1
def find_right(self, nums):
l = 0
r = len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == 0:
l = mid + 1
elif nums[mid] < 0:
l = mid + 1
else:
r = mid - 1
# 最后一个0,l = mid+1 r=mid
# 下标从1开始
return r + 1
def find_num(self, nums):
if not nums or nums[0] == 0 and nums[-1] == 0:
return 0, 0
ll = self.find_left(nums)
rr = self.find_right(nums)
return ll - 1, rr + 1
nums = [-3, -4, -1, 0, 0, 0, 0, 1, 2, 3, 6]
s = Solution()
print(s.find_num(nums))
nums = [0, 0, 0, 0, 1, 2, 3, 6]
print(s.find_num(nums))
nums = [0, 0, 0, 0]
print(s.find_num(nums))