1. 程式人生 > >2018暑假第一題

2018暑假第一題

題目:

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

連結:https://leetcode-cn.com/problems/two-sum/description/

非常low的答案程式碼:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            for j in range(len(nums)):
                if (i!=j):
                    if(nums[i]+nums[j]==target):
                        return [i,j]

這道題非常的簡單了,是為了熟悉python才選擇的簡單題,python語法啥的我都忘了。。。弄了好久才對的,然後下面是大神(網上搜的)程式碼:

class Solution(object):
     def twoSum(self, nums, target):
        nums_bak = nums.copy()                             //將原陣列copy一份,最後的時候取索引
        nums.sort()                                                  //排序
        i = 0
        j = 0
        for k in range(0, (len(nums) - 1)):                  //由於是排序過的,因此只需要將相鄰倆個元素相加,直到大於等於
            if nums[k] + nums[k + 1] >= target:           //需要找的目標,就可以停止了,進入下一步
                i = k
                j = k + 1
                break
        while i >= 0 and j < len(nums):                   //判斷索引有沒有越界
            if nums[i] + nums[j] < target:                  //如果結果小了,向前找更小的
                j += 1
            elif nums[i] + nums[j] > target:                //如果結果大了,向後找更大的
                i -= 1
            else:
                if nums[i] == nums[j]:
                    return [nums_bak.index(nums[i]), nums_bak.index(nums[j], i + 1)]  //如果兩數索引相等,加一位座標記位(?沒太                                                                                                                                 //看懂這一行)
                else:
                    return [nums_bak.index(nums[i]), nums_bak.index(nums[j])]              //如果兩數索引不同,直接返回