【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录

  • 415. 字符串相加(高精度计算、大数运算)
  • 1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐
    • 解法1——按区间长度排序 + 离线询问 + 并查集
    • 解法2——离线算法 + 优先队列
  • 874. 模拟行走机器人(哈希表 + 方向数组)
  • 918. 环形子数组的最大和⭐⭐⭐⭐⭐(升级版子数组的最大和)
    • 分成两种情况计算,取两种情况的最大值
  • 1499. 满足不等式的最大值(单调队列 | 优先队列)
    • 解法1——单调队列维护窗口内的最大值
    • 解法2——优先队列/堆
  • 860. 柠檬水找零(简单无聊模拟题)
  • 42. 接雨水(🐂好题)
    • 解法1——单调栈
    • 解法2——双指针

415. 字符串相加(高精度计算、大数运算)

https://leetcode.cn/problems/add-strings/description/
在这里插入图片描述

模拟即可。

class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder ans = new StringBuilder();
        for (int i = num1.length() - 1, j = num2.length() - 1, c = 0; i >= 0 || j >= 0 || c != 0; --i, --j) {
            if (i >= 0) c += num1.charAt(i) - '0';
            if (j >= 0) c += num2.charAt(j) - '0';
            ans.append(c % 10);
            c /= 10;
        }
        return ans.reverse().toString();
    }
}

更多大数计算可见:
【算法基础】1.4 高精度(模拟大数运算:整数加减乘除)
Java【大数类】整理

1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐

https://leetcode.cn/problems/minimum-interval-to-include-each-query/

在这里插入图片描述

提示:
1 <= intervals.length <= 10^5
1 <= queries.length <= 10^5
queries[i].length == 2
1 <= lefti <= righti <= 10^7
1 <= queries[j] <= 10^7

解法1——按区间长度排序 + 离线询问 + 并查集

https://leetcode.cn/problems/minimum-interval-to-include-each-query/solutions/755131/an-qu-jian-chang-du-pai-xu-chi-xian-bing-6jzs/

换个角度,对每个区间,去回答包含这个区间的询问。

按照区间长度从小到大排序,遍历每个区间,我们可以直接回答在该区间内的尚未被回答的询问,这是因为区间是按长度从小到大排序的,这些未被回答的询问所需要找的最小区间就是当前区间。

由于一个区间内可能存在已经被回答过的询问,所以我们需要跳过这些询问,这可以用并查集来维护,当我们回答一个区间时,将区间所有元素指向其下一个元素,这样当我们用并查集查询到一个回答完毕的区间的左端点时,自然就跳到了区间的右端点的右侧。

class Solution {
    public int[] minInterval(int[][] intervals, int[] queries) {
        // 按区间长度从小到大进行排序
        Arrays.sort(intervals, (a, b) -> a[1] - a[0] - (b[1] - b[0]));
        int m = queries.length;
        int[][] qs = new int[m][2];
        for (int i = 0; i < m; ++i) {
            qs[i] = new int[]{queries[i], i};
        }
        Arrays.sort(qs, (a, b) -> a[0] - b[0]);     // 按查询位置从小到大进行排序

        // 初始化并查集
        int[] p = new int[m + 1];
        Arrays.setAll(p, e -> e);

        int[] ans = new int[m];
        Arrays.fill(ans, -1);

        // 对每个区间,回答所有在 [l, r] 范围内的询问
        // 由于每次回答询问之后,都将其指向了下一个询问
        // 所以若 i = find(i) 符合 i < m && qs[i][0] <= r 的条件,则必然是一个在[l, r] 范围内还没有回答过的询问
        for (int[] interval: intervals) {
            int l = interval[0], r = interval[1];   // 取出当前区间
            int len = r - l + 1;
            int i = bs(qs, l);                      // 找到查询中第一个大于等于左端点的位置
            // 回答所有询问位置在 [l, r] 范围内还没有被回答过的询问
            for (i = find(i, p); i < m && qs[i][0] <= r; i = find(i + 1, p)) {
                ans[qs[i][1]] = len;
                p[i] = i + 1;
            }
        }
        return ans;
    }

    public int bs(int[][] qs, int t) {
        int l = 0, r = qs.length;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (qs[mid][0] < t) l = mid + 1;
            else r = mid;
        }
        return l;
    }

    public int find(int x, int[] p) {
        if (p[x] != x) p[x] = find(p[x], p);
        return p[x];
    }
}

解法2——离线算法 + 优先队列

https://leetcode.cn/problems/minimum-interval-to-include-each-query/solutions/755628/bao-han-mei-ge-cha-xun-de-zui-xiao-qu-ji-e21j/

874. 模拟行走机器人(哈希表 + 方向数组)

https://leetcode.cn/problems/walking-robot-simulation/description/
在这里插入图片描述
用哈希表存储障碍物位置,然后使用方向数组模拟即可。

class Solution {
    public int robotSim(int[] commands, int[][] obstacles) {
        int[] dx = new int[]{0, 1, 0, -1}, dy = new int[]{1, 0, -1, 0};
        int ans = 0, t = 0, x = 0, y = 0;
        Set<String> s = new HashSet<String>();
        for (int[] obstacle: obstacles) s.add(obstacle[0] + " " + obstacle[1]);
        for (int c: commands) {
            if (c == -2) t = (t + 3) % 4;
            else if (c == -1) t = (t + 1) % 4;
            else {
                for (int d = 1; d <= c; ++d) {
                    if (s.contains((x + dx[t]) + " " + (y + dy[t]))) break;
                    x += dx[t];
                    y += dy[t];
                }
                ans = Math.max(ans, x * x + y * y);
            }
        }
        return ans;
    }
}

918. 环形子数组的最大和⭐⭐⭐⭐⭐(升级版子数组的最大和)

https://leetcode.cn/problems/maximum-sum-circular-subarray/

在这里插入图片描述

提示:

n == nums.length
1 <= n <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4​​​​​​​

分成两种情况计算,取两种情况的最大值

在这里插入图片描述

第一种情况就是 普通 子数组的最大和。
第二种情况就是 前缀 + 后缀 的最大和。

class Solution {
    public int maxSubarraySumCircular(int[] nums) {
        int n = nums.length, leftSum = nums[0], pre = nums[0], res = nums[0];
        int[] leftMax = new int[n];
        leftMax[0] = nums[0];

        for (int i = 1; i < n; ++i) {
            pre = Math.max(nums[i], pre + nums[i]);
            res = Math.max(res, pre);
            leftSum += nums[i];     // leftSum是前缀和
            leftMax[i] = Math.max(leftMax[i - 1], leftSum);
        }

        int rightSum = 0;           // rightSum是后缀和
        for (int i = n - 1; i > 0; --i) {
            rightSum += nums[i];
            res = Math.max(res, rightSum + leftMax[i - 1]);
        }
        return res;
    }
}

1499. 满足不等式的最大值(单调队列 | 优先队列)

https://leetcode.cn/problems/max-value-of-equation/

在这里插入图片描述

解法1——单调队列维护窗口内的最大值

从前往后枚举 j ,使用单调队列维护 yi - xi 的最大值。

class Solution {
    public int findMaxValueOfEquation(int[][] points, int k) {
        int n = points.length, ans = Integer.MIN_VALUE;
        Deque<Integer> dq = new ArrayDeque<Integer>();
        // 从前向后枚举 x 一定大于之前的 公式变成 yi + yj + xj - xi(这里 i < j)
        // 所以单调队列里按 yi - xi 从大到小排序
        for (int j = 0; j < n; ++j) {
            // 移除 xj - xi < k 的 i
            while (!dq.isEmpty() && points[j][0] - points[dq.peekFirst()][0] > k) dq.pollFirst();
            // 更新答案
            if (!dq.isEmpty()) {
                int i = dq.peekFirst();
                ans = Math.max(points[j][0] + points[j][1] - points[i][0] + points[i][1], ans);
            }
            // 更新单调队列
            int v = points[j][1] - points[j][0];
            while (!dq.isEmpty() && v >= points[dq.peekLast()][1] - points[dq.peekLast()][0]) dq.pollLast();
            dq.offerLast(j);
        }
        return ans;
    }
}

解法2——优先队列/堆

使用优先队列,队列中的元素是 int[] {x - y, x}

class Solution {
    public int findMaxValueOfEquation(int[][] points, int k) {
        int n = points.length, ans = Integer.MIN_VALUE;
        // 堆中元素按 x - y 从小到大排序
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);
        for (int[] point: points) {
            int x = point[0], y = point[1];
            while (!pq.isEmpty() && pq.peek()[1] < x - k) pq.poll();
            if (!pq.isEmpty()) ans = Math.max(ans, x + y - pq.peek()[0]);
            pq.offer(new int[]{x - y, x});
        }
        return ans;
    }
}

860. 柠檬水找零(简单无聊模拟题)

https://leetcode.cn/problems/lemonade-change/submissions/

在这里插入图片描述
提示:

1 <= bills.length <= 10^5
bills[i] 不是 5 就是 10 或是 20

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int[] cnt = new int[21];
        for (int bill: bills) {
            cnt[bill]++;
            if (bill == 10) cnt[5]--;
            else if (bill == 20) {
                if (cnt[10] > 0) {
                    cnt[10]--;
                    cnt[5]--;
                } else cnt[5] -= 3;
            }

            if (cnt[5] < 0) return false;
        }
        return true;
    }
}

42. 接雨水(🐂好题)

https://leetcode.cn/problems/trapping-rain-water/description/

在这里插入图片描述

解法1——单调栈

class Solution {
    public int trap(int[] height) {
        int n = height.length, ans = 0;
        Deque<Integer> stk = new ArrayDeque();

        for (int i = 0; i < n; ++i) {
	        // 单调递减的栈
            while (!stk.isEmpty() && height[i] >= height[stk.peek()]) {
                int last = stk.pop();
                if (!stk.isEmpty()) {
                    int second = stk.pop();
                    ans += (Math.min(height[i], height[second]) - height[last]) * (i - second - 1);
                    stk.push(second);
                }
            }
            stk.push(i);
        }
        return ans;
    }
}

解法2——双指针

class Solution {
    public int trap(int[] height) {
        int n = height.length, l = 0, r = n - 1, ml = height[l], mr = height[r], ans = 0;
        while (l <= r) {
            if (ml < mr) {
                ans += ml - height[l++];
                if (l <= r) ml = Math.max(ml, height[l]);
            } else {
                ans += mr - height[r--];
                if (r >= l) mr = Math.max(mr, height[r]);
            }
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ts中setState的类型

两种方法: 例子: 父组件 const [value, setValue] useState(); <ChildsetValue{setValue} />子组件 interface Ipros {setValue: (value: string) > void } const Child: React.FC<Ipros> (props) > {}

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

Linux QT通过NFS挂载到Linux开发板上

Linux QT通过NFS挂载到Linux开发板上 说明&#xff1a;这里使用的Linux开发板是正点原子的阿尔法开发板 创建NFS 环境 NFS简介 网络文件系统&#xff0c;英文 Network File System(NFS)&#xff0c;是由 SUN 公司研制的 UNIX 表示层协议 (presentation layer protocol)&…

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

【JavaEE】Spring中注解的方式去存储Bean对象

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结&#xff08;2&#xff09;1. 通过类注解的方式存储Bean对象1.1 五大 类注解1.1.1 Controller 控制器存储1.1.2 Service 服务存储1.1.3 Repository 仓库存储1.1.4 Component 组件存储1.1.5 Configuration 配置存储…

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

Ubuntu linux安装搜狗输入法

效果图&#xff1a; 一、首先要卸载掉自带的输入法 1、以root 身份登录系统并打开终端输入&#xff1a; apt-get remove ibus-pinyin 2、如果卸载后还需要使用&#xff0c;可通过如下方法安装 以root 身份登录系统并打开终端输入&#xff1a; apt-get install ibus-pinyin …

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

^(按位异或)操作符详解

因为未知&#xff0c;所以全力以赴 目录 例1.实现两个数的交换 例2.找出单身狗 1.简单版 2.进阶版 大家好&#xff0c;我是纪宁。这篇博客介绍^操作符及使用案例。 位操作符是对操作数的二进制补码进行操作。^就是位操作符的一种&#xff0c;叫按位异或操作符。计算结果是…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 上节课我们说过了&#xff0c;有一些网站比较痛恨爬虫程序&#xff0c;它们不喜欢被程序所访问&#xff0c;所以它们会检查链接的来源&#xff0c;如果说来源不是正…

【CN-Docker】window11下Docker下开启kubernetes

1. 安装Docker 安装docker步骤如下&#xff1a; 下载Docker启用hyper-v 2.1.powershell&#xff0c;管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装wsl配置Docker镜像加速地址(阿里云) 4.1. "registry-mirrors": [&quo…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…

Selenium 修改 HTTP 请求头三种方式

目录 前言&#xff1a; 什么是 HTTP 请求头 需要更改 HTTP 请求请求头 Selenium 修改请求头 Java HTTP 请求框架 代码实战 使用反向代理 使用 Firefox 扩展 下载火狐浏览器扩展 加载火狐扩展 设置扩展首选项 设置所需的功能 完整自动化用例 前言&#xff1a; Sele…

内存函数及其模拟实现

身体扛不住的时候&#xff0c;意志会带你杀出重围 文章目录 一、memcpy函数 函数介绍 模拟实现 二、memmove函数 函数介绍 模拟实现 三、memset函数 函数介绍 模拟实现 大家好&#xff0c;我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。 一、memcpy函数 …

blender 基础材质篇

材质展示 材质背景介绍 什么是PBR&#xff1f; PBR 全称为 Physically Based Rendering&#xff0c;译为基于物理属性的引擎渲染&#xff0c;也就是说会把物质的颜色、粗糙度、高光属性等进行分别处理&#xff0c;使物质体现出更真实的感觉&#xff1b; 什么是BRDF&#xff…

Vue.js基础简答题

系列文章目录 后续补充 文章目录 系列文章目录前言一、库与框架的区别是什么&#xff1f;二、Vue.js 的核心特性有哪些&#xff1f;三、什么是数据驱动视图&#xff1f;四、MVVM 模型各部分含义是什么&#xff0c;在 Vue.js 中分别对应哪些功能&#xff1f;五、el 选项的作用是…

安全开发-JS应用原生开发JQuery库Ajax技术加密编码库断点调试逆向分析元素属性操作

文章目录 JS原生开发-文件上传-变量&对象&函数&事件JS导入库开发-登录验证-JQuery库&Ajax技术JS导入库开发-编码加密-逆向调试 JS原生开发-文件上传-变量&对象&函数&事件 1、布置前端页面 2、JS获取提交数据 3、JS对上传格式判断 <script>…

数据仓库发展历史

数据仓库发展历史 一、演变 数据仓库是企业中用于存储、整合和分析数据的关键组件。随着时间的推移&#xff0c;数据仓库经历了三代演化&#xff1a;从需求驱动到平台化、从平台化到智能&#xff08;AI&#xff09;化 二、第一代&#xff08;过时&#xff09; 第一代数据仓…

第四讲:MySQL中DDL一些基本数据类型及表的创建、查询

目录 1、创建表:2、DDL一些基本数据类型&#xff1a; 1、创建表: 部分单词及解析&#xff1a; 1、tables:表 2、comment:评论&#xff0c;解释 3、gender:性别 4、neighbor&#xff1a;邻居 1、创建表&#xff1a;&#xff08;注&#xff1a;在自定义数据库操作&#xff0c;…

【itext7】itext7操作PDF文档之添加表单控件(单行文本框、多行文本框、单选框、复选框、下拉框、按钮)

这篇文章&#xff0c;主要介绍itext7操作PDF文档之添加表单控件&#xff08;单行文本框、多行文本框、单选框、复选框、下拉框、按钮&#xff09;。 目录 一、itext操作PDF表单 1.1、添加单行文本框 1.2、添加多行文本框 1.3、添加单选框 1.4、添加复选框 1.5、添加下拉框…