美文网首页
双指针可以解决2-sum问题的数学证明

双指针可以解决2-sum问题的数学证明

作者: 摇摆苏丹 | 来源:发表于2021-09-09 16:53 被阅读0次

设存在长度为n的升序数列x_{0},x_{1},x_{2}\ldots x_{n-1}\boldsymbol{x},设一个目标值为t,假设唯一存在一对x_{i},x_{j}\in \boldsymbol{x},即x_{0} \leq x_{i} \lt x_{j} \leq x_{n-1},使得x_{i}+x_{j}=t

要求证明双指针算法可以在x_{i},x_{j}存在的时候找到这对值。

双指针算法的Java描述如下:

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static List<Integer> solveTwoSum(List<Integer> list, Integer target) {
        // compare的语法自从java7开始支持
        // lambda表达式的语法自从java8开始支持
        list.sort((a, b) -> Integer.compare(a, b));
        // System.out.println(list);
        Integer left = 0;
        Integer right = list.size() - 1;
        while (left < right) {
            Integer tmp = list.get(left) + list.get(right);
            if (tmp < target) {
                left += 1;
            } else if (tmp > target) {
                right -= 1;
            } else {
                return List.of(left, right);
            }
        }
        return List.of(-1, -1);
    }

    public static void main(String[] args) {
        // List.of的语法自从java9开始支持
        List<Integer> list = new ArrayList<>();
        List<Integer> ans;
        Integer target;

        list.clear();
        list.addAll(List.of(1, 2, 3));
        target = 5;
        ans = solveTwoSum(list, target);
        System.out.println(ans);

        list.clear();
        list.addAll(List.of(1, 2, 4, 8, 16, 32));
        target = 25;
        ans = solveTwoSum(list, target);
        System.out.println(ans);
    }
}

证明:

设左指针右移操作为A,设右指针左移操作为B,那么双指针算法会在最多n-1次操作之内找到x_{i},x_{j}。显然x_{i},x_{j}包含在x_{i-1},x_{j}之中,或包含在x_{i},x_{j+1}之中,对于这两种情况,分别经过一次A操作与一次B操作之后可以找到x_{i},x_{j}。同理,x_{i-1},x_{j}也包含在x_{i-2},x_{j}或者x_{i-1},x_{j+1}中,对于这两种情况,分别经过一次A操作与一次B操作之后可以找到x_{i-1},x_{j}。以此类推,经过多次A操作或者B操作之后,总能找到x_{i},x_{j}

相关文章

  • 双指针可以解决2-sum问题的数学证明

    设存在长度为的升序数列为,设一个目标值为,假设唯一存在一对,即,使得。 要求证明双指针算法可以在存在的时候找到这对...

  • 算法练习1:链表算法的解题思路

    一般追赶问题,环大小,都可以使用链表的双指针问题解决。 判断一个链表是否有环? 创建两个指针,一个快指针,一个慢指...

  • 算法学习--双指针

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

  • 【初入阿里】常用的双指针技巧

    我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表...

  • 数学的边界

    问数学的边界在哪里其实就是问数学可以解决哪些问题,数学不能解决哪些问题。 数学不能解决哪些问题? 数学能解决哪些问...

  • K-SUM 算法及子问题 2-SUM、3-SUM、4-SUM

    2-SUM 问题 Question ​ Given an array of integers, return ...

  • LeetCode | 双指针解决相应问题

    167. Two Sum II - Input array is sorted  Given an array o...

  • 算法-字符串算法总结

    思路:字符串类型的题目,一般都可以使用双指针的思路解决。双指针即可以将字符串看成一个由字符组成的数组,使用两个指针...

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • 双指针问题

    题目详细说明请自行到题库 - 力扣 (LeetCode)搜寻题号 1. 两数和 利用数组的有序,使用两个指针,一个...

网友评论

      本文标题:双指针可以解决2-sum问题的数学证明

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