用了一个很巧妙的方法做出来的。
以nums = [2,6,4,8,10,9,15]为例,叙述思路。
假如我们找到左边第一个开始下降的点和右边第一个开始上升的点,那么这两个点中点的所有点都需要排序。但是会有一种情况时[1,3,3,2]。所以我们需要找到的是左边第一个比右边最小的值大的点作为start,在右边找到第一个比左边最大值大的点是end,这样,这两个点中间的所有值就是要排序的点。其实本质还是找左边第一个开始下降的点和右边第一个开始上升的点。
左边最大值又没有说范围,所以不能直接求最大值,这里可以用一边遍历,一遍求的方式。我们可以用for循环来边遍历,边比较。max先设置为nums[0],然后从下标为1的位置开始遍历,每次遍历就先找两个数中最大的数,然后用当前i位置的数和max比较,如果当前i位置的数比max小,
end就是i。找start同理的。
总结就是end是正序遍历,start是倒序遍历。
- class Solution {
- public int findUnsortedSubarray(int[] nums) {
- int start = 0;
- int length = nums.length;
- int end = 0;
- int min = nums[length-1];
- int max = nums[0];
- for(int i= 1;i
- max = Math.max(nums[i],max);
- min = Math.min(nums[length-i-1],min);
- if(nums[i]
- end = i;
- }
- if(nums[length-i-1]>min){
- start =length-i-1;
- }
- }
- if(end == start){
- return 0;
- }
- return end-start+1;
- }
- }
思路
这道题也是看的题解解决的。大家可以看这位大佬的题解,画的图很不错。用的是贪心算法。
代码
- class Solution {
- public int leastInterval(char[] tasks, int n) {
- int[] table = new int[26];
- for(char s:tasks){
- table[s-'A']++;
- }
- int maxCount = 0;
- for(int i = 0;i
- maxCount = Math.max(table[i],maxCount);
- }
- int res = (maxCount-1)*(n+1);
- int temp = 0;
- for(int i = 0;i
- if(table[i]!=0){
- temp++;
- }
- }
- return Math.max((res+temp),tasks.length);
- }
- }
思路
先构造图,然后用dfs遍历图,在遍历的时候判断图是否有圈,有圈就说明是不可能上完的。
代码
- class Solution {
- public boolean canFinish(int numCourses, int[][] prerequisites) {
- int[] flages = new int[numCourses];//记录当前节点是否被访问过。正在访问是1,访问后是2.
- List
> graph = new ArrayList(numCourses); - for(int i = 0;i
- graph.add(new ArrayList
()); - }
- //以上是初始化图的存储结构.
- for(int i = 0;i
- int course = prerequisites[i][0];
- int pre = prerequisites[i][1];
- // 下标为course的数组里面的内容是course的所有前置课程
- graph.get(course).add(pre);
- }
- //以上是将图中赋值。
- //下面用dfs遍历图,并且判断图中是否有圈
- for (int i = 0; i < numCourses; i++) {
- if (dfs(i, flages, graph) == true) {
- return false;
- }
- }
- return true;
- }
- public boolean dfs(int cur, int[] flages, List
> graph) { - if(flages[cur] == 1){
- return true;
- }
- if(flages[cur] == 2){
- return false;
- }
- flages[cur] = 1;
- for(Integer preNode:graph.get(cur)){
- if(dfs(preNode,flages,graph) == true){
- return true;
- }
- }
- flages[cur] = 2;
- return false;
- }
- }
-
相关阅读:
Springsecurity的授权流程
议程公布!Web3 建设者汇聚 DESTINATION MOON 分享见解与探讨
C++——智能指针
USB应用实战视频教程第4期:手把手玩转基于QT6.4的USB BULK上位机和下位机开发下篇(2022-11-07)
初始化全局样式配置与前后端跨域问题
跨境电商系统源码分享,解决你的电商难题
【Java后台】从零开始的Java后台开发(一)
李卓豪:网易数帆数据中台逻辑数据湖的实践
Numpy学习记录
效率神器Apifox_API 文档、API 调试、API Mock、API 自动化测试工具推荐
-
原文地址:https://blog.csdn.net/weixin_56640241/article/details/126056604
-
最新文章
-
C# 内存安全性的重大演进:重新定义 unsafe 关键字
[MAF的Agent管道详解-05]对话历史的持久化和输入输出的增强
一行代码干翻 Java 反射?EggG 流式反射调用让反射优雅到不可思议
vibe coding(二)Where you go:一个微型 windows 桌面覆盖工具
[送码] 用 AI Coding 做了一个 App,谈谈 AI Coding 的真实体验
面试官:说一下 Agent 的常见范式,如何选型?
Excel考勤公式-上班与休息日
完整学习LLM(五):Embedding是什么,为什么文本能变成向量
深度拆解 OpenCoWork:一个本地多智能体桌面平台的架构设计与实现
在影子里验证比较对象:随机指纹和哈希的数学原理