leetcode——“数组”题目合集

本文详细解析了LeetCode中涉及数组的多个经典问题,包括两数之和、盛最多水的容器、三数之和、最接近的三数之和、四数之和等。通过讲解思路、提供示例代码,展示了如何运用哈希表、双指针、排序等算法高效解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路:
这道题用暴力算法是很简单的,但是时间复杂度为O(n^2),所以考虑使用哈希表来用空间换时间。创建一个哈希表,用来储存数组的值和对应所以,并在循环数组存值时判断当前哈希表是否有target和当前数的差值存在,如果存在则构成数组,返回即可。
注意:这种方法巧妙的避开了遍历时可能取到自己差值的情况

代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        //使用Hash表,用空间换时间
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            int val = target - nums[i];
            if(map.containsKey(val)){
                res[0] = map.get(val);
                res[1] = i;
                return res;
            }
            map.put(nums[i],i);
        }
        return res;
    }
}

11. 盛最多水的容器

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

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

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

思路:
两个垂直线构成的面积由两个因素决定:两条垂直线之间的举例和最短垂直线的高度,所以面积的求法为:Math.min(height[i],height[j]) * (j-i)。这里采用双指针法,一个指向开头一个指向最末,再定义一个变量储存最大面积。因为面积由如上两个因素影响,让指针向里移动时,面积有减小趋势,只有将更短的垂直线向里移动才有可能找到更长的线,求得更大面积。

代码:

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

15. 三数之和

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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路:
对于求两个数和为0的算法,是先对数组排序,然后采用双指针,指向最前和最后,如果求出来的和大于指定值,则最后指针往左移,如果小于指定值,则最前元素往右移。
对于这里的三数和,可以在二数和算法外套一个for循环,用来固定一个元素,剩余的部分使用双指针法。
这道题最恶心的就是答案不能包含重复的三元组,这里不能使用List.contains()等方法来排出重复三元组,会出现超时,只能老老实实的用索引来过滤三元组。
出现重复三元组分为以下几种情况:
1.例如在-1,-1-0,1,2中,固定的第一个元素和第二个元素相同时会出现重复三元组,即[-1,1,2],解决方法是在进行双指针法判定之前优先判断当前元素是否和前一个元素相等,如果相等则continue;
2.例如在-2,0,0,0,0,2,2,2中,在固定第一个元素时,后续数字出现重复的0和2,如果只是单纯的左指针+1、右指针-1,会出现重复三元组[-2,0,2],解决办法是在第一个三元组满足条件是,循环处理左右指针,如果左指针的值和右移第一个值相等,左指针+1,一直到找到下个元素不同的地方位置。有指针也是同样的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值