用两个指针,一前一后指向一个有序数组的头和结尾,根据题目的约束条件,头尾指针根据条件分别(只能)头向后、尾向前移动,双指针法能够达到遍历所有可能的情况。 就这个题而言,给了我们一个数组和一个目标数字,要求找到数组中的两个数字(a1,a2)之和等于目标数字(target)。那如何利用双指针法来做呢?首先,我们要对数组排序,假设排好的顺序是从小到大。之后,我们设置两个指针:head、tail,假设它们指向的结点值分别为first、second。那么我们就应该求first+second=target。 设置head=0、tail=length-1。由于我们已经对数组排好序,所以有三种情况: 应对以上三种情况分别有三种对策: 理解了这个证明,也就明白了这种情况下的双指针法。 就这个题来讲,贴一个错误的代码吧,如果题目要求是让返回数组值那不会有错,但是让返回数组下标。。。。 因为排了个序,所以数组下标乱了。就用map<int,int>保存下标。 但是map,同样的键只能保存一个值。所以,当数组中有多个值相同,且它们的和为答案的时候,就没法返回正确的下标了。 找键用的双指针法实现的。题目链接:1. 两数之和
做几个小笔记吧:
class Solution {//两遍哈希 public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> mmp; int length=nums.size(); for (int i=0;i<length;i++){ mmp[nums[i]]=i; } for(int i=0;i<length;i++){ if( mmp.find(target-nums[i])!=mmp.end() && mmp[target-nums[i]]!=i) return {i,mmp[target-nums[i]]}; } return {}; } }; class Solution {//一遍哈希 public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int>m; int length=nums.size(); for(int i=0;i<length;i++){//检查当前遍历到元素的前一个元素是否已经记录。 if(m.find(target-nums[i])!=m.end()) return {m[target-nums[i]],i};//注意返回顺序,下标小的在前面。 m[nums[i]]=i; } return {}; } }; class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: length=len(nums) mmp={} for i in range(length): mmp[nums[i]]=i; for i in range(length): if mmp.get(target-nums[i]) and mmp[target-nums[i]]!=i: return [i,mmp[target-nums[i]]] return []
以上均不是重点。
重点:双指针法。
我理解的双指针法:
举个例子来讲:
证明(最重要):
数组里的数字:a1,a2…………an单增(单调不降)。
不会用数学语言描述,证明写得一塌糊涂。
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int length=nums.size(); int left=0,right=length-1; //存下标 map<int,int> m; for(int i=0;i<length;i++){ m[nums[i]]=i; } sort(nums.begin(),nums.end()); while(left<right){ if(nums[left]+nums[right]<target) left++; else if(nums[left]+nums[right]>target) right--; else { vector<int> ans; if(m[nums[left]]<m[nums[right]]){ ans={m[nums[left]],m[nums[right]]};//vector初始化的一种方法。 }else{ ans={m[nums[right]],m[nums[left]]}; } return ans; } } return {}; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算