判断数组中是否存在和等于给定值的两个数

给定一个正序排列的数组arr=[1,4,5,7,11,13]和一个整数num=9,判断arr中的是否存在和为num的两个数

1、时间复杂度为O(n):

def ch_equal(arr, num):
    start_point = 0;end_point = len(arr) - 1
    len_arr = len(arr)
    com_times = len_arr*(len_arr-1)/2 + len_arr  #max compare times
    move_times = 0
    while move_times<=com_times and start_point<=end_point:
        print start_point,end_point
        if arr[start_point] + arr[end_point] == num:
            m,n = arr[start_point],arr[end_point]
            print m,n
            return m,n
        if arr[start_point] + arr[end_point] < num:
            start_point += 1
            move_times += 1
        if arr[start_point] + arr[end_point] > num:
            end_point -= 1
            move_times += 1
arr = [1,4,5,7,11,13];num = 9
print ch_equal(arr, num)
注意点:

(1)遍历次数,无序排列(len_arr*(len_arr-1)/2),但是又可能出现同一位置两个数len_arr,所以com_times=len_arr*(len_arr-1)/2 + len_arr

(2)由于在不满足相等条件的情况下,start_point一直执行自增操作,end_point一直执行自减操作。若交集至start_point==end_point时还没有满足值出现,此时应该结束查询。另:start_point不能大于数组右边界(len_arr-1),end_point不能小于左边界(0),所以有start_point<len_arr-1,end_point>=0,这种情况会出现arr[4],arr[3]和arr[3],arr[4]位置交换的重复查询

2、时间复杂度为O(n*n)

找出数组中所有可能出现的两个数的组合,把它们放入到set中,使用filter过滤器,找出所有sum()为num的组合

def com_all():
    arr = [1,2,4,5,7,11];num = 9
    len_arr = len(arr)
    full_set = set()
    for i in range(len_arr):
        for j in range(len_arr-i):
            print i,len_arr-j-1
            full_set.add((arr[i],arr[len_arr-j-1]))
    filter_result = filter(lambda x:sum(x)==num,full_set)
    print filter_result



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值