【leetcode】1. 两数之和——寻找两数和为目标值得组合
题目描述
给定一个整数数组 numsnumsnums 和一个目标值 targettargettarget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
输出示例:
给定nums=[2,7,11,15],target=9nums = [2, 7, 11, 15], target = 9nums=[2,7,11,15],target=9
因为 nums[0]+nums[1]=2+7=9nums[0] + nums[1] = 2 + 7 = 9nums[0]+nums[1]=2+7=9
所以返回 [0,1][0, 1][0,1]
思路1
非常自然能够想到的一种思路是:两个嵌套的forforfor循环。
- 第一个循环从000开始遍历numsnumsnums,记每次得到nums[i]nums[i]nums[i];
- 内嵌的第二个forforfor循环从i+1i+1i+1开始遍历numsnumsnums,记每次得到nums[j]nums[j]nums[j];
- 每一步判断nums[i]+nums[j]nums[i]+nums[j]nums[i]+nums[j]是否等于targettargettarget,等于则直接返回。
这种思路实现简单,但时间复杂度稍高为 o(n2)o(n^2)o(n2)。
代码
def twoSum(nums, target): for i in range(len(nums)): for j in range(i + 1, len(nums)): sum = nums[i] + nums[j] if sum == target: return [i, j] return []
思路2——逼夹法
假如数组为有序的情况,分别将指针iii和jjj指向数组首位,那么我们可以通过当前和tmpSum=nums[i]+nums[j]tmpSum=nums[i]+nums[j]tmpSum=nums[i]+nums[j]与targettargettarget的关系进行有目的地移动iii和jjj:小于目标值,iii自增;大于目标值jjj自减。这便是逼夹法。
由于nums并不是有序的,那么需要先对数组进行一次 o(nlog(n))o(n\log(n))o(nlog(n))的排序,再利用逼夹法,显而易见逼夹法的时间复杂度为o(n)o(n)o(n),所以整体复杂度也就是o(nlog(n)+n)o(n\log(n)+n)o(nlog(n)+n)。
*注意:原题需要返回原数组下标,实际上只用逼夹是不合适的,因为得到的下标是排序后的数组下标,但该方法是能够获得相应的数值组合的。
代码
def twoSum(self, nums, target): nums.sort() # 从小到大排序 i = 0 # 头指针 j = len(nums) - 1 # 尾指针 result = [] while True: # 一直循环直至i>=j sum = nums[i] + nums[j] if sum == target: # 假如和便是目标 result.append([i, j]) # 记录结果 # 确定下一轮的指针 ii = i + 1 while ii < j and nums[ii] == nums[i] : # 跳掉重复的 ii += 1 i = ii jj = j - 1 while jj > i and nums[jj] == nums[j]: # 跳掉重复的 jj -= 1 j = jj elif sum > target: # 假如过大,j向前移动,即减少和 j -= 1 else: # 假如过小,i向后移动,即增加和 i += 1 if i >= j: # 逼夹跳出条件 break return result
参考
- [1] leetcode原题
- [2] 详尽源码
- LeetCode—House Robber 寻找数组不相邻组合最大值DP
- 每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置
- LeetCode-198. House Robber (JAVA)寻找数组不相邻组合最大值DP
- leetcode题目 寻找和为SUM的两数(O(nlogn)和O(n)解法)
- LeetCode-从vector到map——在序列中寻找复合条件的组合
- leetcode——Search for a Range 排序数组中寻找目标下标范围(AC)
- Leetcode39.+Leetcode491. 回溯法之应用(三):寻找组合和+求递增子数列
- LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum
- [leetcode, python] Two Sum 两数之和等于某数
- leetcode 27. Remove Element(C语言,快速排序思想,剔除数组中与目标值相等的数)20
- leetcode 329. Longest Increasing Path in a Matrix 矩阵中寻找最长递增序列 + 一个典型的深度优先遍历DFS的做法
- (LeetCode 494)目标和 [DFS + 分类讨论]
- leetcode之深搜递归回溯类-----1/167/653. two sum(记忆化搜索寻找和为给定值的两个数)
- [Leetcode,python] Find All Numbers Disappeared in an Array 寻找数组中消失的数字
- LeetCode 31 Next Permutation 寻找一个数字序列的比他大的最小序列
- [LeetCode] Combination Sum IV 组合之和之四
- leetcode1---两数之和
- [Leetcode] Add two numbers 两数之和
- LeetCode 第一题 两数之和/Two sum
- 【leetcode74】Sum of Two Integers(不用+,-求两数之和)