Hot100之普通数组

53最大子数组和

题目

思路解析

我们用一个dp数组来收集我们从左往右,加起来的最大的和

也就是我们的节点不是负数,那我们直接收集就好了

如果是负数,我们就用Max()比较是这个节点大还是当前节点大(这个情况是为了避免前面的和为-3,而这个节点为-1的这种情况,就是这个节点比前面的最大和还大,那我们就优先用这个节点)

然后Arrays.sort()排序我们的搜集结果的数组,然后返回结果

代码

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int dp[] = new int[n + 1];dp[0] = Integer.MIN_VALUE;for (int i = 1; i <= n; i++) {if (dp[i - 1] >= 0) {dp[i] = dp[i - 1] + nums[i - 1];} else {dp[i] = Math.max(nums[i - 1], dp[i - 1]);}}Arrays.sort(dp);return dp[n];}
}

56合并区间 

题目

思路解析

根据元素的左短点从小到大进行排序

Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));

如果当前节点的左边界,小于上一个节点的有边界,说明存在重叠区间,那么就可以合并区间

当我们为最后一个节点或者当前节点的右边界小于下一个节点的左边界,说明不会出现重叠区间了

代码

我的垃圾代码
class Solution {public int[][] merge(int[][] intervals) {List<int[]> list = new LinkedList<>();if (intervals.length <= 0) {return null;}if (intervals.length == 1) {list.add(intervals[0]);return list.toArray(new int[list.size()][]);}// 根据数组元素的左边界来进行排序,然后将排序好的数组放到List里面Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));if (intervals[0][1] < intervals[1][0]) {list.add(intervals[0]);}for (int i = 1; i < intervals.length; i++) {// 如果当前节点的左边界小于上一个节点的右边界,我们添加节点if (intervals[i][0] <= intervals[i - 1][1]) {intervals[i][0] = Math.min(intervals[i - 1][0], intervals[i][0]);intervals[i][1] = Math.max(intervals[i - 1][1], intervals[i][1]);// 该节点为最后一个元素,或者该节点的右边界小于下一个节点的左边界,说明不会出现重叠节点了if (i == intervals.length - 1 || intervals[i][1] < intervals[i + 1][0]) {list.add(intervals[i]);}} // 该节点为最后一个元素,或者该节点的右边界小于下一个节点的左边界,说明不会出现重叠节点了else if (i == intervals.length - 1 || intervals[i][1] < intervals[i + 1][0]) {list.add(intervals[i]);continue;} else {continue;}}return list.toArray(new int[list.size()][]);}
}
灵神的代码
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (p, q) -> p[0] - q[0]); // 按照左端点从小到大排序List<int[]> ans = new ArrayList<>();for (int[] p : intervals) {//ans是目前已经合并的区间,ans.size()是目前已经合并区间的数量int m = ans.size();// 可以合并if (m > 0 && p[0] <= ans.get(m - 1)[1]) { //更新ans里面的区间ans.get(m - 1)[1] = Math.max(ans.get(m - 1)[1], p[1]); // 更新右端点最大值} else { // 不相交,无法合并ans.add(p); // 新的合并区间}}return ans.toArray(new int[ans.size()][]);}
}

189轮转数组

 

题目

思路解析

写一个翻转函数

然后整体翻转

再对两个区间分别翻转,这样就好了

特定的翻转位置 k=k%n;

代码

class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k = k % n;//先全体翻转reverse(nums, 0, n - 1);//我们向右轮转了k次,那么就是我们的末尾向右移动了k次//因为我们反转后,我们的末尾变成了我们的头//那么就相当于我们向右移动了1次//然后我们在0->(k-1)这个位置翻转//和k->n-1这个位置翻转,就得到我们的结果了reverse(nums, 0, k - 1);reverse(nums, k, n - 1);}private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}
}

238除自身以外数组的乘积

 

题目

思路解析

前后缀分解解法

一个L[]存前面的乘积

一个R[]存后面的乘积

代码

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int answer[] = new int[n];int L[] = new int[n];int R[] = new int [n];//先初始化为1L[0] = 1;R[n - 1] = 1;for (int i = 1; i < n; i++) {L[i] = nums[i - 1] * L[i - 1];}for (int i = n - 2; i >= 0; i--) {R[i] = R[i + 1] * nums[i + 1];}for (int i = 0; i < n; i++) {answer[i] = L[i] * R[i];}return answer;}
}

41缺失的第一个正数

题目

思路解析

哈希表解法(空间复杂度不满足要求)

我们把所有数都放到Map里面

因为我们要找到是整数

所以我们for循环从1开始,来找我们的Map是否包含这个正数

第一个不包含的就是我们的答案

将数组视为Hash表

由于题目要求我们「只能使用常数级别的空间」,而要找的数一定在 [1, N + 1] 左闭右闭(这里 N 是数组的长度)这个区间里。因此,我们可以就把原始的数组当做哈希表来使用。事实上,哈希表其实本身也是一个数组;

我们要找的数就在 [1, N + 1] 里,最后 N + 1 这个元素我们不用找。因为在前面的 N 个元素都找不到的情况下,我们才返回 N + 1;

那么,我们可以采取这样的思路:就把 1 这个数放到下标为 0 的位置, 2 这个数放到下标为 1 的位置,按照这种思路整理一遍数组。

然后我们再遍历一次数组

第 1 个遇到的它的值不等于下标的那个数,就是我们要找的缺失的第一个正数。

这个思想就相当于我们自己编写哈希函数

这个哈希函数的规则特别简单,那就是数值为 i 的数映射到下标为 i - 1 的位置

如何判断该数没有放到正确的位置上(条件判断)

我们是通过某些条件,判断该数没有放到正确的位置上

那我们该如何判断这个数没有放到正确的位置上然后进行两个数之间的交换呢?

for (int i = 0; i < len; i++) {while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {// 满足在指定范围内、并且没有放在正确的位置上,才交换// 例如:数值 3 应该放在索引 2 的位置上swap(nums, nums[i] - 1, i);}}
nums【i】>0

因为我们要找正数,所以我们遇到大于0的正数我们就要把他放到正确的位置

nums【i】<=length

数组的有效索引范围是 0 到 len - 1,而缺失的正整数必须在 1 到 len 的范围内

如果 nums[i] 大于 len,那么它不会影响缺失的正整数,因为任何大于 len 的正整数都不可能是缺失的第一个正整数

如果没有这个条件会怎么样?

考虑 nums = [1,5,7]

因为我们的交换条件是nums[nums[i] - 1] != nums[i]

如果我们使用到5的时候,我们的nums[nums[i] - 1]就会出现越界错误

nums[nums[i] - 1] != nums[i]

我们要交换的是数字1到下标为0的位置,数字2到下标为1的位置

也就是nums【i】的值到nums【i】-1的位置

for循环遍历查找第一个不满足的值

我们要找到的值是nums【i】=i+1

当遇到的第一个不满足条件的值,该下标(i+1)就是我们要找的答案

// [1, -1, 3, 4]// [1,2,0]for (int i = 0; i < len; i++) {if (nums[i] != i + 1) {return i + 1;}}// 都正确则返回数组长度 + 1return len + 1;

代码

哈希表解法(空间复杂度不满足要求)
import java.util.HashSet;
import java.util.Set;public class Solution {public int firstMissingPositive(int[] nums) {int len = nums.length;Set<Integer> hashSet = new HashSet<>();for (int num : nums) {hashSet.add(num);}for (int i = 1; i <= len ; i++) {if (!hashSet.contains(i)){return i;}}return len + 1;}
}
将数组视为Hash表
public class Solution {public int firstMissingPositive(int[] nums) {int len = nums.length;for (int i = 0; i < len; i++) {while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {// 满足在指定范围内、并且没有放在正确的位置上,才交换// 例如:数值 3 应该放在索引 2 的位置上swap(nums, nums[i] - 1, i);}}// [1, -1, 3, 4]// [1,2,0]for (int i = 0; i < len; i++) {if (nums[i] != i + 1) {return i + 1;}}// 都正确则返回数组长度 + 1return len + 1;}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用天赋实现最大化的价值输出-补

原文&#xff1a; https://blog.csdn.net/ZhangRelay/article/details/145408621 ​​​​​​如何利用天赋实现最大化的价值输出-CSDN博客 如何利用天赋实现最大化的价值输出-CSDN博客 引用视频差异 第一段视频目标明确&#xff0c;建议也非常明确。 录制视频的人是主动性…

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&am…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…

【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例

目录 说明举例 说明 简单来说&#xff0c;android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要&#xff0c;而是多个控件的属性值之比发挥作用&#xff0c;例如有2个控件&#xff0c;各自的android:layout_weight的值设为0.5和0.5&#xff0…

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

Spring Boot项目中解决跨域问题(四种方式)

目录 一&#xff0c;跨域产生的原因二&#xff0c;什么情况下算跨域三&#xff0c;实际演示四&#xff0c;解决跨域的方法 1&#xff0c;CrossOrigin注解2&#xff0c;添加全局过滤器3&#xff0c;实现WebMvcConfigurer4&#xff0c;Nginx解决跨域5&#xff0c;注意 开发项目…

浅析DNS污染及防范

DNS污染&#xff08;DNS Cache Poisoning&#xff09;是一种网络攻击手段&#xff0c;通过篡改DNS服务器的缓存数据&#xff0c;将域名解析结果指向错误的IP地址&#xff0c;从而误导用户访问恶意网站或无法访问目标网站。这种攻击利用了DNS协议的特性&#xff0c;例如“只认第…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…

大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探

以下视频内容为叶梓分享DeepSeek多模态大模型janus的部署&#xff0c;并验证其实际效果&#xff0c;包括图生文和文生图两部分。 叶梓老师人工智能培训分享DeepSeek多模态大模型janus初探 DeepSeek 的多模态大模型 Janus 是一款强大的 AI 模型&#xff0c;专注于图像和文本的多…

Linux系统上安装与配置 MySQL( CentOS 7 )

目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …

17.2 图形绘制7

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.2.9 字体 17.2.9.1 Font类 Font类定义特定的文本格式&#xff0c;包括字体、字号和样式特性。 Font常用属性&#xff1a; Na…

浅析DDOS攻击及防御策略

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求&#xff0c;耗尽其资源&#xff0c;从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性&#xff0c;使攻击规模更大、影响范围更广…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

HarmonyOS NEXT:保存应用数据

用户首选项使用 用户首选项的特点 数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。 用户搜选项&#xff08;Preferences&#xff09;提供了轻量级配置数据的持久化能力&#xff0c;支持订阅数据变化的通知能力。不支持分布式同…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…