'''
有一个严格升序排列的整数数组 nums ,数组中的值各不相同,假设按照升序排序的数组在预先未知的某个点上进行了旋转。
(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
给你旋转后的数组和一个整数 target 。请你在旋转后的数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。要求时间复杂度为 logn。
示例 1:输入 nums = [4,5,6,7,0,1,2], target = 0;输出:4
示例 2:输入 nums = [4,5,6,7,0,1,2], target = 3;输出:-1
'''
def func(nums, target):
left = 0
right = len(nums)-1
while left + 1 < right:
mid = (left + right) >> 1
if nums[mid] < nums[right]:
right = mid
else:
left = mid
#最终left即为断点所在 即nums[0:right] 与nums[right:]均为单调递增数组
idx1 = bisect_left(nums[0:right], target)
if nums[idx1] == target:
return idx1
idx2 = bisect_left(nums[right:], target)
if nums[idx2+right] == target:
return idx2+right
return -1
'''
给定A[1..n],求将其分成3个和相等的连续子数组的方案数(子数组互不相交且全覆盖A)。
n<=10^5
A=[1,0,1,1]
{1} {0,1} {1}
{1,0} {1} {1}
ans = 2
'''
def func(nums):
if sum(nums)%3 != 0:
return 0
S = sum(nums)//3
pre = [0]
count1 = 0
ans = 0
for i, a in enumerate(nums):
if i < len(nums) - 1:
pre.append(pre[-1]+a)
if pre[-1] == 2*S:
ans += count1
#count1为之前出现过的满足pre[idx]=S的idx的数目
if pre[-1] == S:
count1 += 1
return ans
x>y x< y
S_0_1 x dx S_0_x dy + S_0_1 y dy S_0_y dx = 2/3
PonyAi一面20220917
最新推荐文章于 2024-08-07 21:27:48 发布