美文网首页
双指针方案-有序矩阵

双指针方案-有序矩阵

作者: 黑夜0411 | 来源:发表于2022-07-29 15:22 被阅读0次

    适用于有序矩阵(数组也是矩阵),相比其他算法目的是减少搜索空间,但是有前提条件,有序。关键思想:固定参数,比较,舍弃不合适的搜索空间。

    例子1、给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数(不可以重复使用同一个数),返回两个数的下标值 i 和 j,要求 i < j。

    假设每个输入有且仅有一个答案。

    示例:

    输入:numbers = [2, 7, 11, 15], target = 9

    输出:[0, 1]

    (注意:这里和原题略有不同,下标改为从 0 开始,更自然。)

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

        int i = 0;

        int j = nums.length - 1;

        while (i < j) {

            int sum = nums[i] + nums[j];

            if (sum < target) {

                i++;

            } else if (sum > target) {

                j--;

            } else {

                return new int[]{i, j};

            }

        }

        return new int[]{-1, -1};

    }

    举一反三:二维矩阵搜索

    例题:LeetCode 240 - Search a 2D Matrix II[2](Medium)

    一个  的矩阵 matrix 有如下特点:

    每行的元素从左到右升序排列

    每列的元素从上到下升序排列

    写一个高效的算法在矩阵中搜索目标值 target。

    本期题解:LeetCode 11 - Container With Most Water[1](Medium)

    给定  个非负整数 ,每个数代表坐标中的一个点  。在坐标内画  条竖直线,竖直线  的两个端点分别为  和 。找出其中的两条线,使得它们与  轴共同构成的容器可以容纳最多的水。

    说明:你不能倾斜容器,且  的值至少为 2。

    题目示例

    图中垂直线代表输入数组 [3,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    public int maxArea(int[] height) {

        int res = 0;

        int i = 0;

        int j = height.length - 1;

        while (i < j) {

            int area = (j - i) * Math.min(height[i], height[j]);

            res = Math.max(res, area);

            if (height[i] < height[j]) {

                i++;

            } else {

                j--;

            }

        }

        return res;

    }

    相关文章

      网友评论

          本文标题:双指针方案-有序矩阵

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