lincode 3.27-3.28 - 数据结构--数组(高频题)

1.三数之和
描述:
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
注意事项:
在三元组(a, b, c),要求a <= b <= c。结果不能包含重复的三元组。
样例:
如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:(-1, 0, 1) (-1, -1, 2)
标签 :
数组 两根指针 排序 脸书
分析:
在输入了数据列表后,先对列表进行排序;我定义了三个指针,一个放在列表末尾index_j,一个放在列表开头index_i,还有一个依次的递增index。基本思路就是固定列表开头的数字,之后的数依次与该数相加,用他们的和与列表末尾的数求和,看结果是否为0。如果结果小于0:说明本列表中没有比两数和更大的数字,index+1,将index_j复原,准备进行下一轮比较。如果结果大于0:说明列表中可能存在与两数和相加和为1的数,将index_j-1,依次比较。如果结果等于0:将三个数存在空列表中。index+1,当index_j=index时,index_i=index_i+1,进行下一轮比较。

    def threeSum(self, numbers):
        result = []
        numbers.sort()
        index_i=0
        index=index_i+1
        index_j=len(numbers)-1
        while index_i+1<index_j:
            temp = numbers[index_i]+numbers[index]
            if temp + numbers[index_j]>0 and index<index_j:
                index_j=index_j-1
            elif temp + numbers[index_j]<0:
                index=index+1
            else:
                result.append((numbers[index_i], numbers[index], numbers[index_j]))
                index=index+1
            if index==index_j:
                index_i=index_i+1
                index=index_i+1
                index_j=len(numbers)-1
        a = list(set(result))
        a.sort(key=result.index)
        return a

2.两个排序数组的中位数
描述:
两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。
样例:
给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5。给出数组A = [1,2,3] B = [4,5],中位数 3
分析:现将两个数组中的数放入一个数组,遍历B放入A中,排序。计算数组中点,判断奇偶。
好像不符合题目。排序数组的条件没有用到,但是结果是正确的,还很简单。

    def findMedianSortedArrays(self, A, B):
        result = 0
        for i in B:
            A.append(i)
        A.sort()
        n = len(A)-1
        m=int(n/2)
        if (n%2)==0:
            result = result + A[m]
        else:result=result+(A[m]+A[m+1])/2
        return result

猜你喜欢

转载自blog.csdn.net/fangafangxiaoniu/article/details/79723278