Merge pull request #1821 from juguagua/leetcode-modify-the-code-of-the-greedy

更新贪心部分:至 监控二叉树
This commit is contained in:
程序员Carl
2022-12-21 10:50:14 +08:00
committed by GitHub
4 changed files with 57 additions and 61 deletions

View File

@ -207,21 +207,23 @@ class Solution:
``` ```
### Go ### Go
```golang ```go
func merge(intervals [][]int) [][]int { func merge(intervals [][]int) [][]int {
//先从小到大排序
sort.Slice(intervals, func(i, j int) bool { sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0] return intervals[i][0] < intervals[j][0]
}) })
//再弄重复的 res := make([][]int, 0, len(intervals))
for i:=0;i<len(intervals)-1;i++{ left, right := intervals[0][0], intervals[0][1]
if intervals[i][1]>=intervals[i+1][0]{ for i := 1; i < len(intervals); i++ {
intervals[i][1]=max(intervals[i][1],intervals[i+1][1])//赋值最大值 if right < intervals[i][0] {
intervals=append(intervals[:i+1],intervals[i+2:]...) res = append(res, []int{left, right})
i-- left, right = intervals[i][0], intervals[i][1]
} else {
right = max(right, intervals[i][1])
} }
} }
return intervals res = append(res, []int{left, right}) // 将最后一个区间放入
return res
} }
func max(a, b int) int { func max(a, b int) int {
if a > b { if a > b {

View File

@ -62,9 +62,9 @@
每次取非交叉区间的时候都是可右边界最小的来做分割点这样留给下一个区间的空间就越大所以第一条分割线就是区间1结束的位置。 每次取非交叉区间的时候都是可右边界最小的来做分割点这样留给下一个区间的空间就越大所以第一条分割线就是区间1结束的位置。
接下来就是找大于区间1结束位置的区间是从区间4开始。**那有同学问了为什么不从区间5开始别忘已经是按照右边界排序的了**。 接下来就是找大于区间1结束位置的区间是从区间4开始。**那有同学问了为什么不从区间5开始别忘已经是按照右边界排序的了**。
区间4结束之后找到区间6所以一共记录非交叉区间的个数是三个。 区间4结束之后找到区间6所以一共记录非交叉区间的个数是三个。
总共区间个数为6减去非交叉区间的个数3。移除区间的最小数量就是3。 总共区间个数为6减去非交叉区间的个数3。移除区间的最小数量就是3。
@ -184,22 +184,18 @@ public:
class Solution { class Solution {
public int eraseOverlapIntervals(int[][] intervals) { public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b)-> { Arrays.sort(intervals, (a,b)-> {
// 按照区间右边界升序排序 return Integer.compare(a[0],b[0]);
return a[1] - b[1];
}); });
int count = 1;
int count = 0; for(int i = 1;i < intervals.length;i++){
int edge = Integer.MIN_VALUE; if(intervals[i][0] < intervals[i-1][1]){
for (int i = 0; i < intervals.length; i++) { intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
// 若上一个区间的右边界小于当前区间的左边界,说明无交集 continue;
if (edge <= intervals[i][0]) {
edge = intervals[i][1];
}else{ }else{
count++; count++;
} }
} }
return intervals.length - count;
return count;
} }
} }
``` ```
@ -208,7 +204,6 @@ class Solution {
```java ```java
class Solution { class Solution {
public int eraseOverlapIntervals(int[][] intervals) { public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b)-> { Arrays.sort(intervals, (a,b)-> {
return Integer.compare(a[0],b[0]); return Integer.compare(a[0],b[0]);
}); });
@ -242,28 +237,27 @@ class Solution:
``` ```
### Go ### Go
```golang ```go
func eraseOverlapIntervals(intervals [][]int) int { func eraseOverlapIntervals(intervals [][]int) int {
var flag int
//先排序
sort.Slice(intervals, func(i, j int) bool { sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0]<intervals[j][0] return intervals[i][1] < intervals[j][1]
}) })
fmt.Println(intervals) res := 1
for i := 1; i < len(intervals); i++ { for i := 1; i < len(intervals); i++ {
if intervals[i-1][1]>intervals[i][0]{ if intervals[i][0] >= intervals[i-1][1] {
flag++ res++
intervals[i][1]=min(intervals[i-1][1],intervals[i][1])//由于是先排序的,所以,第一位是递增顺序,故只需要将临近两个元素的第二个值最小值更新到该元素的第二个值即可作之后的判断 } else {
intervals[i][1] = min(intervals[i - 1][1], intervals[i][1])
} }
} }
return flag return len(intervals) - res
} }
func min(a, b int) int { func min(a, b int) int {
if a>b{ if a < b {
return b
}
return a return a
} }
return b
}
``` ```
### Javascript: ### Javascript:

View File

@ -217,7 +217,7 @@ class Solution: # 贪心思路
``` ```
### Go ### Go
```golang ```go
func maxProfit(prices []int, fee int) int { func maxProfit(prices []int, fee int) int {
var minBuy int = prices[0] //第一天买入 var minBuy int = prices[0] //第一天买入
var res int var res int

View File

@ -179,7 +179,7 @@ class Solution:
``` ```
### Go ### Go
```golang ```go
func monotoneIncreasingDigits(N int) int { func monotoneIncreasingDigits(N int) int {
s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 s := strconv.Itoa(N)//将数字转为字符串,方便使用下标
ss := []byte(s)//将字符串转为byte数组方便更改。 ss := []byte(s)//将字符串转为byte数组方便更改。