leetcode:Max Chunks To Make Sorted I&&II
题目一:Max Chunks To Make Sorted II
1、题目链接
leetcode No768:https://leetcode.com/problems/max-chunks-to-make-sorted-ii/
This question is the same as "Max Chunks to Make Sorted" except the integers of the given array are not necessarily distinct, the input array could be up to length 2000, and the elements could be up to 10**8.Given an array arr of integers (not necessarily distinct), we split the array into some number of "chunks" (partitions), and individually sort each chunk. After concatenating them, the result equals the sorted array.What is the most number of chunks we could have made?Example 1:Input: arr = [5,4,3,2,1]Output: 1Explanation:Splitting into two or more chunks will not return the required result.For example, splitting into [5, 4], [3, 2, 1] will result in [4, 5, 1, 2, 3], which isn't sorted.Example 2:Input: arr = [2,1,3,4,4]Output: 4Explanation:We can split into two chunks, such as [2, 1], [3, 4, 4].However, splitting into [2, 1], [3], [4], [4] is the highest number of chunks possible.Note:arr will have length in range [1, 2000].arr[i] will be an integer in range [0, 10**8].
2、Solution
题目的意思是,给一个数组a
我们将它切成几个小的数组a1
,a2
,a3
…an
,在每个小的数组ax
内排好序,即可以得到数组a
排好序的结果。
排序前:a = a1 + a2 + a3 + ... ax... + an
排序后:sort(a) = sort(a1) + sort(a2) + sort(a3)+ ... sort(ax)... + sort(an)
从排序后的结果来看,a1
里的数都不大于a2
里的数,依此类推…
因而,我们可以这样来找到一个切分,切分左边的数,肯定不大于右边的所有数,也就是,切分点左边的最大值,不大于右边的最小值。
我们遍历数组,就判断该点左边(包含该点)的最大值,和其右边的最小值比较,假如不大于,这该点便可以作为分割点。
golang实现代码如下
func maxChunksToSorted(arr []int) int { res := 0 minRight := make([]int ,len(arr)) maxLeft:=arr[0] minRight[len(arr)-1] = arr[len(arr)-1] //维护一个数组,保存其右边最小的值 for i:=len(arr)-2;i>=0;i--{ minRight[i] = min(minRight[i+1],arr[i]) } //遍历数组,将左边的最大值和左边的最小值比较 for i:=0;i<len(arr)-1;i++{ maxLeft = max(maxLeft,arr[i]) if (maxLeft<=minRight[i+1]){ res ++ } } return res+1 }//返回两数较小的func min(a int, b int) int{ if a < b{ return a } return b}//返回两数较大的func max(a int, b int) int{ if a > b{ return a } return b}
题目二:Max Chunks To Make Sorted
1、题目链接:
leetcode No 679:https://leetcode.com/problems/max-chunks-to-make-sorted/
Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into some number of "chunks" (partitions), and individually sort each chunk. After concatenating them, the result equals the sorted array.What is the most number of chunks we could have made?Example 1:Input: arr = [4,3,2,1,0]Output: 1Explanation:Splitting into two or more chunks will not return the required result.For example, splitting into [4, 3], [2, 1, 0] will result in [3, 4, 0, 1, 2], which isn't sorted.Example 2:Input: arr = [1,0,2,3,4]Output: 4Explanation:We can split into two chunks, such as [1, 0], [2, 3, 4].However, splitting into [1, 0], [2], [3], [4] is the highest number of chunks possible.Note:arr will have length in range [1, 10].arr[i] will be a permutation of [0, 1, ..., arr.length - 1].
2、Solution
题目二其实是题目一的特例,完全复用题目一的解法也没有问题。
如题目一,给一个数组a
我们将它切成几个小的数组a1
,a2
,a3
…an
,在每个小的数组ax
内排好序,即可以得到数组a
排好序的结果。
排序前:a = a1 + a2 + a3 + ... ax... + an
排序后:sort(a) = sort(a1) + sort(a2) + sort(a3)+ ... sort(ax)... + sort(an)
其中:sort(a) = [0, 1, ..., arr.length - 1]
sort(ax) = [0,1,2,....k]
数组ax
的最大值为k
,ax数组个数为k。因而从左开始遍历,当左边数组的最大值等于索引值时,即是满足的分割点。
例如:
original: 0, 2, 1, 4, 3, 5, 7, 6max: 0, 2, 2, 4, 4, 5, 7, 7sorted: 0, 1, 2, 3, 4, 5, 6, 7index: 0, 1, 2, 3, 4, 5, 6, 7
go实现的代码如下
func maxChunksToSorted(arr []int) int { var res int m := 0 for i:=0;i<len(arr);i++{ m = max(m,arr[i]) if (m == i){ res++ } } return res}func max(a int,b int) int{ if a > b { return a } return b}
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » leetcode:Max Chunks To Make Sorted I&&II