【LeetCode】挑战100天 Day14(热题+面试经典150题)

【LeetCode】挑战100天 Day14(热题+面试经典150题)

  • 一、LeetCode介绍
  • 二、LeetCode 热题 HOT 100-16
    • 2.1 题目
    • 2.2 题解
  • 三、面试经典 150 题-16
    • 3.1 题目
    • 3.2 题解

一、LeetCode介绍

在这里插入图片描述
LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。

LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。

除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。

挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。

二、LeetCode 热题 HOT 100-16

2.1 题目

最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

 

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:

输入:nums = [0,0,0], target = 1
输出:0
 

提示:

3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 10^4

2.2 题解

本题可以使用双指针法解决最接近的三数之和问题的代码。时间复杂度为 O(n^2),其中 n 是数组的长度。

解题思路:

  1. 对数组进行排序,以便于使用双指针法遍历数组。
  2. 初始化一个变量 diff,用于记录当前最接近的和与目标值的差距,初始值为无穷大。
  3. 遍历排序后的数组,固定一个数(假设为 nums[i]),并使用双指针法在剩余的元素中查找另外两个数,使它们的和最接近 target。
  4. 在双指针法中,设置左指针指向 i+1,右指针指向数组末尾。计算当前三个数的和 sum = nums[i] + nums[left] + nums[right]。
    • 如果 sum == target,直接返回 target 作为最接近的和。
    • 如果 sum 与 target 的差距小于 diff,更新 diff 和结果值 result。
    • 如果 sum > target,将右指针左移一位。
    • 如果 sum < target,将左指针右移一位。
  5. 遍历完所有可能的组合后,返回结果值 result。
public class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int n = nums.length;
        int diff = Integer.MAX_VALUE; // 初始差距设为最大值
        int result = 0;

        for (int i = 0; i < n - 2; i++) {
            int left = i + 1;
            int right = n - 1;

            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == target) {
                    return target;
                }

                if (Math.abs(sum - target) < diff) {
                    diff = Math.abs(sum - target);
                    result = sum;
                }

                if (sum > target) {
                    right--;
                } else {
                    left++;
                }
            }
        }

        return result;
    }
}

【LeetCode】挑战100天 Day14(热题+面试经典150题)_第1张图片

三、面试经典 150 题-16

数组 / 字符串

3.1 题目

接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。


示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 
示例 2:

输入:height = [4,2,0,3,2,5]
输出:9
 

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 10^5

【LeetCode】挑战100天 Day14(热题+面试经典150题)_第2张图片

3.2 题解

本题可以使用双指针法解决接雨水问题的代码。时间复杂度为 O(n),其中 n 是数组的长度。

解题思路:

  1. 使用两个指针 left 和 right 分别指向数组的首尾。
  2. 初始化变量 leftMax 和 rightMax 为 0,用于记录左边和右边的最大高度。
  3. 初始化变量 ans 为 0,用于记录结果。
  4. 当 left 小于等于 right 时,进行以下操作:
    • 如果 height[left] 小于等于 height[right],表示左边的柱子较低,可以接到雨水。
      • 如果 height[left] 大于等于 leftMax,更新 leftMax。
      • 否则,将 ans 增加 leftMax 减去 height[left],表示接到的雨水量。
      • 将 left 右移一位。
    • 如果 height[left] 大于 height[right],表示右边的柱子较低,可以接到雨水。
      • 如果 height[right] 大于等于 rightMax,更新 rightMax。
      • 否则,将 ans 增加 rightMax 减去 height[right],表示接到的雨水量。
      • 将 right 左移一位。
  5. 最终返回 ans。
public class Solution {
    public int trap(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int leftMax = 0;
        int rightMax = 0;
        int ans = 0;

        while (left <= right) {
            if (height[left] <= height[right]) {
                if (height[left] >= leftMax) {
                    leftMax = height[left];
                } else {
                    ans += leftMax - height[left];
                }
                left++;
            } else {
                if (height[right] >= rightMax) {
                    rightMax = height[right];
                } else {
                    ans += rightMax - height[right];
                }
                right--;
            }
        }

        return ans;
    }
}

【LeetCode】挑战100天 Day14(热题+面试经典150题)_第3张图片

至此,挑战100天 AI In LeetCode Day14(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。

你可能感兴趣的:(LeetCode,leetcode,算法,java)