Python两次和-蛮力方法

时间:2019-01-03 04:30:12

标签: python arrays loops

我是Python的新手,刚刚开始尝试LeetCode来构建我的排骨。在这个经典问题上,我的代码错过了一个测试用例。

问题如下:

  

给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。

     

您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。

     

示例:

     

给出数字= [2,7,11,15],目标= 9,

     

因为nums [0] + nums [1] = 2 + 7 = 9,   返回[0,1]。

我错过了目标编号为6的测试用例[3,2,4],它应该返回索引[1,2],但是在目标编号为测试用例[1,5,7]的情况下6(当然会返回索引[0,1]),因此在while循环中似乎出现了问题,但是我不太确定是什么。

class Solution:
    def twoSum(self, nums, target):
        x = 0
        y = len(nums) - 1
        while x < y:
            if nums[x] + nums[y] == target:
                return (x, y)
            if nums[x] + nums[y] < target:
                x += 1
            else:
                y -= 1
        self.x = x
        self.y = y
        self.array = array       
        return None

test_case = Solution()    
array = [1, 5, 7]
print(test_case.twoSum(array, 6))

在目标为6的测试用例[3,2,4]上,输出返回null,因此甚至没有汇总索引1和2,我可以为y分配错误吗?

5 个答案:

答案 0 :(得分:2)

class Solution:
    def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            ls=[]
            l2=[]
            for i in nums:
                ls.append(target-i)

            for i in range(len(ls)):
                if ls[i] in nums  :
                    if i!= nums.index(ls[i]):
                        l2.append([i,nums.index(ls[i])])            
            return l2[0]


x= Solution()
x.twoSum([-1,-2,-3,-4,-5],-8)

输出

[2, 4]

答案 1 :(得分:1)

方法不同。我们将根据需要构建一个值字典,该字典由我们要查找的值构成键;如果我们寻找一个值,则在该值首次出现时会对其进行索引。一旦找到满足问题的值,就可以完成。时间也是O(N)

class Solution:
    def twoSum(self, nums, target):
        look_for = {}
        for n,x in enumerate(nums):
            try:
                return look_for[x], n
            except KeyError:
                look_for.setdefault(target - x,n)

test_case = Solution()
array = [1, 5, 7]
array2 = [3,2,4]
given_nums=[2,7,11,15]
print(test_case.twoSum(array, 6))
print(test_case.twoSum(array2, 6))
print(test_case.twoSum(given_nums,9))

输出:

(0, 1)
(1, 2)
(0, 1)

答案 2 :(得分:1)

一种蛮力的解决方案是将一个循环双重嵌套在列表上,其中内部循环仅查看比外部循环当前所在的索引大的索引。

class Solution:
    def twoSum(self, nums, target):
        for i, a in enumerate(nums, start=0):
            for j, b in enumerate(nums[i+1:], start=0):
                if a+b==target:
                    return [i, j+i+1]

test_case = Solution()
array = [3, 2, 4]
print(test_case.twoSum(array, 6))

array = [1, 5, 7]
print(test_case.twoSum(array, 6))

array = [2, 7, 11, 15]
print(test_case.twoSum(array, 9))

输出:

[1, 2]
[0, 1]
[0, 1]

答案 3 :(得分:0)

import itertools

class Solution:
    def twoSum(self, nums, target):
        subsets = []
        for L in range(0, len(nums)+1):
            for subset in itertools.combinations(nums, L):
                if len(subset)!=0:
                    subsets.append(subset)
        print(subsets) #returns all the posible combinations as tuples, note not permutations!
        #sums all the tuples
        sums = [sum(tup) for tup in subsets]
        indexes = []
        #Checks sum of all the posible combinations
        if target in sums:
            i = sums.index(target)
            matching_combination = subsets[i] #gets the option
            for number in matching_combination:
                indexes.append(nums.index(number))
            return indexes
        else:
            return None


test_case = Solution()    
array = [1,2,3]
print(test_case.twoSum(array, 4))

我正在尝试用您的榜样进行自己的学习。我对发现的结果感到满意。我用itertools为我组合了所有数字。然后,我使用列表操作对输入数组中所有可能的数字组合求和,然后仅检查一次目标是否在求和数组中。如果不是,则返回None,否则返回索引。请注意,如果将这三个索引加到目标中,则该方法也会返回所有三个索引。抱歉,花了这么长时间:)

答案 4 :(得分:0)

即使是较短的代码,这也是更全面的内聚效率代码。

nums = [6, 7, 11, 15, 3, 6, 5, 3,99,5,4,7,2]
target = 27
n = 0

for i in range(len(nums)):
    
    n+=1
    if n == len(nums):
      n == len(nums)
      
    else:
        if nums[i]+nums[n] == target:
          # to find the target position 
          print([nums.index(nums[i]),nums.index(nums[n])])
          # to get the actual numbers to add print([nums[i],nums[n]])