开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
algorithm
/
src
/
arrays
/
array_16.java
algorithm
/
src
/
arrays
/
array_16.java
array_16.java 3.33 KB
一键复制 编辑 原始数据 按行查看 历史
Byte 提交于 2026年07月03日 06:34 +08:00 . 11
package arrays;
import java.util.Arrays;
/**
* 题目:求需要排序的最短子数组
* y: [0,2,4,1,8]
* 只需要排序 2 4 1就可以使用数组递增有序,所以返回3
*
* @Author Gavin
* @date 2022年01月17日 21:19
*/
public class array_16 {
/**
* 解题思路:
* 第一种方法:先把数组排序,然后和元数组进行对比,左右下标进行对比,如果元数组
* 下标对应的值和排序后下标对应的值相同就说明有序
*/
//Time:O(N*log(n)) Space:O(n)
public static int solution_1(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int[] sorted = nums.clone();
Arrays.sort(sorted);
int i = 0, j = nums.length - 1;
while (i < nums.length && nums[i] == sorted[i]) ++i;
while (j >= 0 && nums[j] == sorted[j]) --j;
return Math.max(j - i + 1, 0);
}
/**
* 第二种方法:
* 我们要明确排序后数组的特点,从左往右是依次递增的
* 所以我们可以使用两个指针分别从左往右和从右往左依次移动,左边移动到
* i+1 < i 的时候暂停移动,右边j移动到j < j-1 的时候暂停移动,这样就找到了两个边界值以及一个
* 区间 i ~ j ,然后从这个区间找到最大值和最小值,拿最小值和0到i进行比较,因为此时0到i是有序的,
* 同理用最大值和j到数组末尾进行对比,这样就能找到最小的区间了,只需要遍历两次数组,时间复杂度为
* o(n)
*/
public static int solution_2(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int n = nums.length-1;
int i = 0, j = n;
while (i < n && nums[i + 1] >= nums[i]) ++i;
while (j > 0 && nums[j - 1] <= nums[j]) --j;
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
//求i~j之间的最大值和最小值
for (int k = i; k <= j; ++k) {
min = Math.min(min, nums[k]);
max = Math.max(max, nums[k]);
}
while (i >= 0 && min < nums[i]) --i;//最后会多减一次
while (j <= n && max > nums[j]) ++j;//最后会多加一次
//i+1 ~ j-1 所以长度就为: j-1 - (i+1) +1
return Math.max(j - i - 1, 0);//和0比较是因为如果是递增有序的数组那么j-i就是负数了
}
/**
* 第三种方法:
* 仍然是利用递增数组的特点,我们只需要遍历一次数组,同样我们使用两个指针进行移动
* i从左到右移动,每移动一个就求最大值看是否和当前值相等(因为递增的特点),同理,j从末尾开始向左
* 移动,并求最小值是否和当前值相等。
* 最后求j-i+1的大小就行
*
* 由于递增的特点,往左能够找到最左边界的一个大值,同理,最右边能够找到一个小值的边界值
*/
public int solution_3(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int n = nums.length;
int i = 0, j = -1, min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int k = 0; k < n; k++) {
max = Math.max(max, nums[k]);
if (nums[k] != max) j = k;
int p = n - 1 -k;
min = Math.min(min, nums[p]);
if (nums[p] != min) i = p;
}
return j - i + 1;
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/Gavery/algorithm.git
git@gitee.com:Gavery/algorithm.git
Gavery
algorithm
algorithm
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /