双指针方案-有序矩阵

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

例子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;

}

你可能感兴趣的:(双指针方案-有序矩阵)