LeetCode简单题之两数之和
題目
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]
提示:
2 <= nums.length <= 10 ^4
-10 ^9 <= nums[i] <= 10 ^9
-10 ^9 <= target <= 10 ^9
只會存在一個有效答案
進階:你可以想出一個時間復雜度小于 O(n2) 的算法嗎?
來源:力扣(LeetCode)
解題思路
??一般而言一個需要迭代的題目首先想到的最簡單的策略便是貪心策略,所以此題可以用最簡單的方法,即兩層循環來完成。
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i+1,len(nums)):if nums[i]+nums[j]==target:return [i,j]
當然以上代碼的時間復雜度達到了O(n^2)。按照一般算法的優化思路就是在貪心策略的基礎之上進行優化的,觀察實例1不難發現后兩個元素其實是比target值大的,所以我們在設計代碼的時候可以加入一個判斷來避免做無效的加和運算,當然這對于短的數組來說可能效果不大。
??假設有一個數組[a,b,c],target=d,以數組前兩個元素為例做分析,假設a>0并且d也>0,那么如果a>d且b>0,我們就不需要計算a+b的值了,假設a<0和d<0都成立,那么如果a<d且b<0,同樣我們便不需要計算a+b;假設a>0且d<0,如果b>0,那么很明顯我們不需要計算a+b,相反a<0且d>0,如果b<0,則不需要計算a+b,直接跳過b再判斷(a,c,d)。
改進后的代碼:
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:flag=0for i in range(len(nums)):if nums[i]>0 and target>0 and nums[i]>target:flag=1elif nums[i]<0 and target<0 and nums[i]<target:flag=-1else:flag=0for j in range(i+1,len(nums)):if nums[j]>0 and flag==1:continueif nums[j]<0 and flag==-1:continueif flag==0 and nums[i]>0 and target<0 and nums[j]>0:continueif flag==0 and nums[i]<0 and target>0 and nums[j]<0:continueif nums[i]+nums[j]==target:return [i,j]
理論上改進的代碼應該耗時更短才正常,這可能是由于我的代碼不規范或者題目規模較小導致的。
當然優化的方法不一,也可以先將數組進行排序,然后判斷target和數組前面元素的關系從而將數組切片減少加和對比的次數,不過這樣需要同時返回排序前的index。
總結
以上是生活随笔為你收集整理的LeetCode简单题之两数之和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬核科普:到底啥是云原生?
- 下一篇: LeetCode中等题之无重复字符的最长