PonyAi一面20220917

'''
有一个严格升序排列的整数数组 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值