当前位置:网站首页>LeetCode581+621+207
LeetCode581+621+207
2022-08-04 09:13:00 【想进阿里的小菜鸡】
用了一个很巧妙的方法做出来的。
以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<length;i++){
max = Math.max(nums[i],max);
min = Math.min(nums[length-i-1],min);
if(nums[i]<max){
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<table.length;i++){
maxCount = Math.max(table[i],maxCount);
}
int res = (maxCount-1)*(n+1);
int temp = 0;
for(int i = 0;i<table.length;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<ArrayList<Integer>> graph = new ArrayList(numCourses);
for(int i = 0;i<numCourses;i++){
graph.add(new ArrayList<Integer>());
}
//以上是初始化图的存储结构.
for(int i = 0;i<prerequisites.length;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<ArrayList<Integer>> 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;
}
}
边栏推荐
猜你喜欢
如何快速将Zabbix5.0升级至6.0?
NAT/NAPT地址转换(内外网通信)技术详解【华为eNSP】
Anton Paar Anton Paar Density Meter Hydrometer Repair DMA35 Performance Parameters
leetcode经典例题——56.合并区间
【正点原子STM32连载】第二章 STM32简介 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
spark算子讲解
一道[CSCCTF 2019 Qual]FlaskLight的详解再遇SSTI
渗透——信息收集
B站回应HR称“核心用户都是Loser”、求职者是“白嫖党”:已被劝退
交换机链路聚合详解【华为eNSP】
随机推荐
VRRP+MSTP配置详解【华为eNSP实验】
leetcode单调栈经典例题——最大矩形
GBsae 8 c database using an error, how to do?
四大网络攻击常见手段及防护
TiDB升级与案例分享(TiDB v4.0.1 → v5.4.1)
张朝阳对话俞敏洪:谈宇宙、谈焦虑、谈创业、谈退休、谈人生
.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)
微信消息从发送到接收,经历了什么?如何防止丢包
递归思想
三层交换机/路由器OSPF配置详解【华为eNSP实验】
NAT/NAPT地址转换(内外网通信)技术详解【华为eNSP】
云函数实现网站自动化签到配置详解【Web函数/Nodejs/cookie】
How to restore the Youxuan database with only data files
基于cRIO-904X搭建Simulink与Labview环境
Fiddler(一)安装
LVGL's multi-language conversion tool -- a good assistant for font settings
ShowMeAI —— Show u 三连
Detailed explanation of switch link aggregation [Huawei eNSP]
Could you please talk about how the website is accessed?[Interview questions in the web field]
leetcode二叉树系列(二叉搜索树篇)