两数之和

两数之和_第1张图片

  • 太烦了,做了好久终于没问题了,之前也做出来了,但运行速度不大行,才击败了30%几,之前的代码忘记copy过来了,大概用到的方法是构建一个列表sub_nums,sub_nums=target-nums,对sub_nums的每个元素都在nums里寻找一遍,若存在,则立即跳出循环
  • 小周告诉了我还有一种简单一点的方法,以上方法的复杂度为 o ( n 2 ) o(n^2) o(n2),下面这种方法好像是 o ( n log ⁡ n ) o(n\log n) o(nlogn)
    • 先对列表排序(升序)设定两个指针分别指向列表的头和尾
      • 关于排序函数的运用,这里要注意
      • nums.sort()--不能返回一个list,即type(num.sort())的结果是“Nonetype”
      • 想要返回一个排好序的list,应该用nums=sorted(nums)
    • 根据num[p]+num[q]与target的关系对p,q做相应变化,<就p右移,>就q左移
    • 在写这个方法的代码时,我常常出错,出错的代码为 :
nums=[18, 24, 29, 32, 34, 37, 41, 42, 44, 53, 57, 58, 59, 74]
n = len(nums)
num = sorted(nums)
target = 74
p = num[0]
q = num[n-1]
j = n-1
for i in range(0,n):
    print(p,q)
    if p+q<target:
        p = num[i+1]
        print("p=",p)
    elif p+q>target:
        while p+q>target:
            j=j-1
            q= num[j]
            print("q=",q)
    else:
        p_index=nums.index(p)                
        if p == q:
            nums[p_index]=p+1                    
        q_index=nums.index(q)                
        if p_index < q_index:                    
            print(p_index,q_index)
        else:                    
            print(q_index,p_index)
  • 我终于知道哪里错了,不能用for循环啊这里,否则,即使p+q>target,p没有任何问题,在对q做while循环以后,i也会+1,p肯定就会改变了
  • 以下是正确的代码
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        num = sorted(nums)
        #print(num)
        p=0
        q=n-1
        while p<q:
            if num[p]+num[q]>target:
                q=q-1
            elif num[p]+num[q]<target:
                p=p+1
            else:
                index_p=nums.index(num[p])
                if num[p]==num[q]:
                    nums[index_p]=nums[index_p]+1
                index_q=nums.index(num[q])
                if index_p<index_q:
                    return [index_p,index_q]
                else:
                    return [index_q,index_p]

       

两数之和_第2张图片

你可能感兴趣的:(leetcode)