用两个指针,一前一后指向一个有序数组的头和结尾,根据题目的约束条件,头尾指针根据条件分别(只能)头向后、尾向前移动,双指针法能够达到遍历所有可能的情况。 就这个题而言,给了我们一个数组和一个目标数字,要求找到数组中的两个数字(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网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)