美文网首页
算法学习--双指针

算法学习--双指针

作者: yanlong107 | 来源:发表于2021-05-11 19:17 被阅读0次

双指针分类

  • 快慢指针
  • 左右指针

快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节点等
左右指针:主要解决数组(或者字符串)中的问题:比如:二分查找

快慢指针

题目: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点

ListNode* getKthFromEnd(ListNode* head, int k) {
        

        ListNode* later = head;
        ListNode* first = head;

        for (int i = 0; i < k; i++) {
            if (first == NULL) {
                return NULL;
            }
            first = first->next;
        }

        while(first) {
            later = later->next;
            first = first->next;
        }

        return later;
    }

左右指针

题目:给定一个按照升序排列的有序整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标
tips: 无序的数组求和,可以使用map来做

vector<int> twoSum(vector<int>& nums, int target) {

        vector<int> res;
        
        int left = 0; 
        int right = nums.size() - 1;
        int sum = -1;
        while (left < right) {
            sum = nums[left] + nums[right];
            if (sum == target) {
                res.push_back(left);
                res.push_back(right);
                return res;
            } else if (sum > target) {
                right --;
            } else if (sum < target) {
                left ++;
            }
        }
        return res;
    }

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标

 public int[] twoSum(int[] nums, int target) {

        HashMap<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            int currentFirst = nums[i];
            int needSecond = target - currentFirst;
            int nextIndex = -1;
            if (map.containsKey(needSecond)) {
                nextIndex = map.get(needSecond);
            }
            if (nextIndex >=0) {
                return new int[]{i, nextIndex};
            }
            map.put(currentFirst, i);
        }

        throw new IllegalArgumentException("No two sum solution");
    }

相关文章

  • 【剑指offer-双指针】

    导读 算法 | 双指针套路总结 常用的双指针技巧 算法与数据结构基础 - 双指针 目录: 面试题04. 二维数组中...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • 滑动窗口算法

    一、滑动窗口算法 也会使用两个指针,但和双指针算法不同的是双指针算法关注的往往是两个指针正在指向的两个元素,而滑动...

  • 双指针算法

    元素:数组目标:求三数之和思路:数组遍历 首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向...

  • 『算法』『数据结构』 浅谈滑动窗口算法(思想)[双指针法中的左右

    基本认识 滑动窗口算法的本质是双指针法中的左右指针法,滑动窗口算法是双指针法中的左右指针法更为形象的一种表达方式。...

  • 大厂算法面试之leetcode精讲7.双指针

    大厂算法面试之leetcode精讲7.双指针 视频教程(高效学习):点击学习[https://xiaochen10...

  • LeetCode进阶977-双指针

    概要 双指针是一种比较常见的算法思想,在循环遍历数组时经常会用到。双指针主要有两种算法技巧:1、快慢指针(例如已发...

  • 双指针算法总结

    简介 双指针算法其实也可以称作是滑动窗口法,跟上一篇介绍的最长回文子串的介绍很相似,都是用两个指针来表示指针中间的...

  • 算法(一) 双指针

    如有疑问,或者指点,欢迎留言,谢谢~ 2020.4.21:统计「优美子数组」,属于每日一题 1.思路,使用双指针,...

  • 双指针法(算法)

    案例: 盛最多水的容器、三数之和、最接近的三数之和 双指针法一般对应于有序数组的情况,通过调节指针(左右移动),...

网友评论

      本文标题:算法学习--双指针

      本文链接:https://www.haomeiwen.com/subject/cltidltx.html