diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md index 2ff37372..7b092c9b 100644 --- a/problems/0056.合并区间.md +++ b/problems/0056.合并区间.md @@ -207,24 +207,26 @@ class Solution: ``` ### Go -```golang +```go func merge(intervals [][]int) [][]int { - //先从小到大排序 - sort.Slice(intervals,func(i,j int)bool{ - return intervals[i][0]=intervals[i+1][0]{ - intervals[i][1]=max(intervals[i][1],intervals[i+1][1])//赋值最大值 - intervals=append(intervals[:i+1],intervals[i+2:]...) - i-- + res := make([][]int, 0, len(intervals)) + left, right := intervals[0][0], intervals[0][1] + for i := 1; i < len(intervals); i++ { + if right < intervals[i][0] { + res = append(res, []int{left, right}) + 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{ - if a>b{ +func max(a, b int) int { + if a > b { return a } return b diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 6ac29996..33f8c3f2 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -62,9 +62,9 @@ 每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。 -接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘已经是按照右边界排序的了**。 +接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 -区间4结束之后,在找到区间6,所以一共记录非交叉区间的个数是三个。 +区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。 总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。 @@ -183,23 +183,19 @@ public: ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - Arrays.sort(intervals, (a, b) -> { - // 按照区间右边界升序排序 - return a[1] - b[1]; + Arrays.sort(intervals, (a,b)-> { + return Integer.compare(a[0],b[0]); }); - - int count = 0; - int edge = Integer.MIN_VALUE; - for (int i = 0; i < intervals.length; i++) { - // 若上一个区间的右边界小于当前区间的左边界,说明无交集 - if (edge <= intervals[i][0]) { - edge = intervals[i][1]; - } else { + int count = 1; + for(int i = 1;i < intervals.length;i++){ + if(intervals[i][0] < intervals[i-1][1]){ + intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]); + continue; + }else{ count++; - } + } } - - return count; + return intervals.length - count; } } ``` @@ -208,16 +204,15 @@ class Solution { ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - - Arrays.sort(intervals,(a,b)->{ + Arrays.sort(intervals, (a,b)-> { return Integer.compare(a[0],b[0]); }); int remove = 0; int pre = intervals[0][1]; - for(int i=1;iintervals[i][0]) { + for(int i = 1; i < intervals.length; i++) { + if(pre > intervals[i][0]) { remove++; - pre = Math.min(pre,intervals[i][1]); + pre = Math.min(pre, intervals[i][1]); } else pre = intervals[i][1]; } @@ -242,27 +237,26 @@ class Solution: ``` ### Go -```golang +```go func eraseOverlapIntervals(intervals [][]int) int { - var flag int - //先排序 - sort.Slice(intervals,func(i,j int)bool{ - return intervals[i][0]intervals[i][0]{ - flag++ - intervals[i][1]=min(intervals[i-1][1],intervals[i][1])//由于是先排序的,所以,第一位是递增顺序,故只需要将临近两个元素的第二个值最小值更新到该元素的第二个值即可作之后的判断 + res := 1 + for i := 1; i < len(intervals); i++ { + if intervals[i][0] >= intervals[i-1][1] { + res++ + } else { + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) } } - return flag + return len(intervals) - res } -func min(a,b int)int{ - if a>b{ - return b +func min(a, b int) int { + if a < b { + return a } - return a + return b } ``` diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md index faa56d42..005f9c38 100644 --- a/problems/0714.买卖股票的最佳时机含手续费.md +++ b/problems/0714.买卖股票的最佳时机含手续费.md @@ -217,25 +217,25 @@ class Solution: # 贪心思路 ``` ### Go -```golang +```go func maxProfit(prices []int, fee int) int { var minBuy int = prices[0] //第一天买入 var res int - for i:=0;i=minBuy&&prices[i]-fee-minBuy<=0{ + if prices[i] >= minBuy && prices[i]-fee-minBuy <= 0 { continue } //可以售卖了 - if prices[i]>minBuy+fee{ + if prices[i] > minBuy+fee { //累加每天的收益 - res+=prices[i]-minBuy-fee + res += prices[i]-minBuy-fee //更新最小值(如果还在收获利润的区间里,表示并不是真正的卖出,而计算利润每次都要减去手续费,所以要让minBuy = prices[i] - fee;,这样在明天收获利润的时候,才不会多减一次手续费!) - minBuy=prices[i]-fee + minBuy = prices[i]-fee } } return res diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md index 89630827..e8666bcd 100644 --- a/problems/0738.单调递增的数字.md +++ b/problems/0738.单调递增的数字.md @@ -179,7 +179,7 @@ class Solution: ``` ### Go -```golang +```go func monotoneIncreasingDigits(N int) int { s := strconv.Itoa(N)//将数字转为字符串,方便使用下标 ss := []byte(s)//将字符串转为byte数组,方便更改。 @@ -187,10 +187,10 @@ func monotoneIncreasingDigits(N int) int { if n <= 1 { return N } - for i:=n-1 ; i>0; i-- { - if ss[i-1] > ss[i] {//前一个大于后一位,前一位减1,后面的全部置为9 + for i := n-1; i > 0; i-- { + if ss[i-1] > ss[i] { //前一个大于后一位,前一位减1,后面的全部置为9 ss[i-1] -= 1 - for j := i ; j < n; j++ {//后面的全部置为9 + for j := i; j < n; j++ { //后面的全部置为9 ss[j] = '9' } }