双指针

作者: couriravant | 来源:发表于2023-04-23 15:58 被阅读0次

盛最多水的容器(Container With Most Water)。

题目描述:

给定一个非负整数数组height,每个元素表示一个高度。找出两个高度,其间的距离与两个高度的最小值的乘积最大。也就是说,找到一对i和j,使得i < j且(height[i], height[j])可以盛水的容器面积最大。

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

public int maxArea(int[] height) {
    int left = 0, right = height.length - 1;
    int maxArea = 0;
    while (left < right) {
        int area = Math.min(height[left], height[right]) * (right - left);
        maxArea = Math.max(maxArea, area);
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return maxArea;
}

这道题可以使用双指针来解决。我们可以设置两个指针,一个指向数组的开头,一个指向数组的结尾。然后我们计算当前指针指向的两个高度的最小值乘以它们之间的距离,得到当前容器的面积。接着我们将较小的那个高度的指针向内移动,因为如果我们移动高度较大的指针,那么容器的面积只会变小。我们不断地移动指针,直到两个指针相遇为止,期间记录每次计算的容器面积的最大值即可。

三数之和(3Sum)。

题目描述:

给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

解题思路:

这道题可以使用双指针来解决。首先我们对数组进行排序,然后我们枚举数组中的每一个元素作为a,然后在剩余的元素中使用双指针找到满足b + c = -a的所有组合。由于题目中要求不重复的三元组,所以我们需要注意避免重复的情况。

public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    Arrays.sort(nums);
    int n = nums.length;
    for (int i = 0; i < n - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) { // 避免重复
            continue;
        }
        int left = i + 1, right = n - 1;
        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) {
                result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                left++;
                right--;
                while (left < right && nums[left] == nums[left - 1]) { // 避免重复
                    left++;
                }
                while (left < right && nums[right] == nums[right + 1]) { // 避免重复
                    right--;
                }
            } else if (sum < 0) {
                left++;
            } else {
                right--;
            }
        }
    }
    return result;
}

相关文章

  • ZXAlgorithm - C7 Two Pointers

    Outline相向双指针同向双指针 Two SumPartitionSort 0 Templete 同向双指针,相...

  • 双指针:15.三数之和

    考点:双指针 使用双指针搜索之前排序 动态循环双指针m,n

  • Python算法-双指针(Two Pointers)

    双指针分为「对撞指针」、「快慢指针」、「分离双指针」。 参考来源:https://algo.itcharge.cn...

  • 双指针法(Swift代码篇)

    双指针法有三种: 左右指针法(头尾指针法) 快慢指针法 滑动窗口 左右指针法 左右指针法是最常见的双指针法,左右两...

  • 双指针

    双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。双指针可以从不同的方向向中间逼近也可以朝着同一个...

  • 双指针

    颜色分类,最令我头疼的一个双指针问题... 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排...

  • 双指针

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

  • 双指针

    双指针问题总结 双指针经典问题 twoSum (有序数组) 字符串翻转 先看一个例子: leetcode 345....

  • 双指针

    LC605 这道题是分类讨论,果然还是用到了离散数学里面的思想,你要覆盖所有情况, 我当时自己想就没有想全面,这实...

  • 双指针

    15. 三数之和[https://leetcode-cn.com/problems/3sum/]【中等】 18. ...

网友评论

      本文标题:双指针

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