栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构-线性表(数组)-双指针->数组逼近(左右指针)167&15*

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构-线性表(数组)-双指针->数组逼近(左右指针)167&15*

  1. 两数之和 II - 输入有序数组
  • 思路
    我的思路:从数组两端逼近target,左右指针指向元素和大于target,则右指针左移;反之,左值针右移。
    其他:确定一个元素,找target-nums[i],有序数组,二分查找。
  • 代码
    我的做法:
class Solution {
public:
    vector twoSum(vector& numbers, int target) {
        int len = numbers.size();
        int left = 0,right = len-1;
        while(left < right){
            if(numbers[left]+numbers[right] > target) --right;
            else if(numbers[left]+numbers[right] < target) ++left;
            else break;
        }
        return {left+1,right+1};
    }
};

二分查找:

class Solution {
public:
    vector twoSum(vector& numbers, int target) {
        int len = numbers.size();
        int temp = 0,j = 0,i = 0;
        for(i;i
            temp = target - numbers[i];
            int left = i+1,right = len-1;
            while(left<=right){
                int mid = left + (right-left)/2;
                if(numbers[mid]>temp) right = mid - 1;
                else if(numbers[mid]j = mid;return {i+1,j+1};}
            }
            if(j != 0) break;
        }
        return {i+1,j+1};
    }
};
  • 总结学习
    hash表可用来对无序数组进行查找,有序数组要想到二分法和双指针。

三数之和

  • 思路
    为什么进行排序:避免计算重复
    我没做出来的原因:题目要求不重复,我没有想到对数组排序后可能相邻元素有重复的。
    重点:对相邻元素去重 continue关键字
  • 代码
vector> threeSum(vector& nums) {
        int len = nums.size();
        sort(nums.begin(),nums.end());
        vector> res;
        int left = 0,right = 0;
        int i = 0;
        for(i; i
            if(i>0 && nums[i] == nums[i-1]) continue;//去重
            left = i + 1;
            right = len - 1;
            while(left
                if(nums[left]+nums[right]>(-nums[i])) --right;
                else if(nums[left]+nums[right]<-nums[i]) ++left;
                else {
                    res.push_back({nums[i],nums[left],nums[right]});
                    ++left;
                    --right;
                    while(left 
  • 总结
    双指针方法对,但是要会再加点别的,比如本题的去重。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号