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

news2024/10/7 18:20:00

文章目录

  • 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

会议OA项目之会议审批(亮点功能:将审批人签名转换为电子手写签名图片)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.主要功能点介绍 二.效果展示 三.前端…

AVLTree深度剖析(双旋)

在上一篇文章中我们提到了&#xff0c;单旋的情况&#xff08;无论是左单旋还是右单旋&#xff09;&#xff0c;都仅仅适用于绝对的左边高或者绝对的右边高 b插入&#xff0c;高度变为h1&#xff0c;我们可以来试试单旋会变成什么样子 旋完之后&#xff0c;形成了对称关系&…

自然语言处理之AG_NEWS新闻分类

前言: 先简单说明下&#xff0c;关于AG_NEWS情感分类的案例&#xff0c;网上很多博客写了&#xff0c;但是要么代码有问题&#xff0c;要么数据集不对&#xff0c;要么API过时&#xff0c;在这里我再更新一篇博客。希望对各位同学有一定的应用效果。 1、DataSets 数据集的处理…

部署mycat2

因为mycat是Java写的&#xff0c;要装jdk 下载包 jdk-8u261-linux-x64.rpm 安装 安装好后&#xff0c;查看版本 安装mycat2 解压到data目录 修改权限 把所需的jar复制到mycat/lib目录 查看MyCat目录结构 回为mycat代理连接启动时需要有一个默认的数据源&#xff0c;所以我们…

C#读取写入文件的三种方式

最新对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。 我这里使用窗体来做测试&#xff0c;例子在文末&#xff0c;可下载。 1&#xff1a;二进制读写 /// <summary>/// 二进制写入文件/// </summary>private void button1_Click(object sender, E…

PuTTY连接服务器报错Connection refused

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程

有时遇到这种需求&#xff0c;在上传文件的同时还需要带上token凭据和其它表单信息&#xff0c;那么这个需求前端可以使用FormData数据类型来实现。FormData和JSON一样也是通过body传递的&#xff0c;前者支持字符串和二进制文件&#xff0c;后者只能是字符串&#xff0c;如下图…

[CISCN 2023 初赛]go_session 解题思路过程

过程 下载题目的附件&#xff0c;是用go的gin框架写的后端&#xff0c;cookie-session是由gorilla/sessions来实现&#xff0c;而sessions库使用了另一个库&#xff1a;gorilla/securecookie来实现对cookie的安全传输。这里所谓的安全传输&#xff0c;是指保证cookie中的值不能…

STM32 USB使用记录:HID类设备(前篇)

文章目录 目的基础说明HID类演示代码分析总结 目的 USB是目前最流行的接口&#xff0c;现在很多个人用的电子设备也都是USB设备。目前大多数单片机都有USB接口&#xff0c;使用USB接口作为HID类设备来使用是非常常用的&#xff0c;比如USB鼠标、键盘都是这一类。这篇文章将简单…

向npm注册中心发布包(上)

目录 1、创建package.json文件 1.1 fields 字段 1.2 Author 字段 1.3 创建 package.json 文件 1.4 自定义 package.json 的问题 1.5 从当前目录提取的默认值 1.6 通过init命令设置配置选项 2、创建Node.js 模块 2.1 创建一个package.json 文件 2.2 创建在另一个应用程…

UE5 AI移动无动作问题

文章目录 问题背景解决方法问题背景 在使用行为树让角色移动时,出现角色行走不播放动作的情况: 解决方法 其实有2个问题导致出现这种情况 1、角色动画蓝图的问题 角色动画蓝图可能存在4个问题: ① 无播放行走动画 ② 速度的值未正常传递 ③ 播放移动动作逻辑的值判断错…

【每日一题】——C - Standings(AtCoder Beginner Contest 308 )

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

Clion开发STM32之W5500系列(DNS服务封装)

概述 在w5500基础库中进行封装&#xff0c;通过域名的方式获取实际的ip地址用于动态获取ntp的ip地址 DNS封装 头文件 /*******************************************************************************Copyright (c) [scl]。保留所有权利。****************************…

JVM对象在堆内存中是否如何分配?

1&#xff1a;指针碰撞&#xff1a;内存规整的情况下 2&#xff1a;空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收…

win10环境下,应用无法启动并被删除(无法完成操作,因为文件包含病毒或潜在的垃圾文件)

现象&#xff1a; 解决办法&#xff1a; 一、关闭所有自己安装的杀毒软件&#xff0c;如&#xff1a;360安全卫士&#xff0c;金山毒霸等 二、关闭win10本身的杀毒软件&#xff0c;步骤如下&#xff1a; 1、搜索栏输入“病毒和威胁防护” 2、进入以后&#xff0c;点击"病…

Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类

目录 1.ResNet残差网络 1.1 ResNet定义 1.2 ResNet 几种网络配置 1.3 ResNet50网络结构 1.3.1 前几层卷积和池化 1.3.2 残差块&#xff1a;构建深度残差网络 1.3.3 ResNet主体&#xff1a;堆叠多个残差块 1.4 迁移学习猫狗二分类实战 1.4.1 迁移学习 1.4.2 模型训练 1.…

vue3基础+进阶(二、vue3常用组合式api基本使用)

目录 第二章、组合式API 2.1 入口&#xff1a;setup 2.1.1 setup选项的写法和执行时机 2.1.2 setup中写代码的特点 2.1.3 script setup语法糖 2.1.4 setup中this的指向 2.2 生成响应式数据&#xff1a;reactive和ref函数 2.2.1 reactive函数 2.2.2 ref函数 2.2.3 rea…

Cesium态势标绘专题-入口

本专题没有废话,只有代码,撸! 标绘主类MilitaryPlotting.ts /** 态势标绘主类* @Author: Wang jianLei* @Date: 2023-01-13 14:47:20* @Last Modified by: jianlei wang* @Last Modified time: 2023-05-31 09:55:34*/ import * as Creator from ./create/index; import Cre…

S32K324双核的核间通信使用示例

文章目录 前言修改ld文件核0的ld文件核1的ld文件 定义共享数据使用共享数据编译共享数据文件总结 前言 最近项目用S32K324开发&#xff0c;暂时只用了MCAL&#xff0c;没有Autosar上层的模块&#xff0c;最开始用官方给的demo工程双核可以正常跑起来&#xff0c;但实际开发时都…

使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)

名词解释 RTSP &#xff08;Real-Time Streaming Protocol&#xff09; 是一种网络协议&#xff0c;用于控制实时流媒体的传输。它是一种应用层协议&#xff0c;通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求&#xff0c;如…