台州椒江网站建设,婚恋网站女代我做彩票,网站视频怎么下载到本地,动漫设计学什么内容Q1. 是否能用贪心算法#xff1f;为什么#xff1f; 先预设一个策略#xff0c;每当当前的nums[i]满足可以 成块#xff0c;就直接让这个数成块#xff0c;也就是说之后的遍历过程中不会将这个数在考虑到自己的块内#xff0c; 成块 是指只要只… Q1. 是否能用贪心算法为什么 先预设一个策略每当当前的nums[i]满足可以 成块就直接让这个数成块也就是说之后的遍历过程中不会将这个数在考虑到自己的块内 成块 是指只要只需要将nums[i]放到前面的某个子数组的尾部然后将这个子数组进行排序就能得到一个拥有连续自然数的子数组就称为成块 能够使用谈心算法是因为有如下规律 规律1. 以nums[i]为结尾的成块的子数组其中的最大值不能小于 i 反证法假设nums[i]为结尾的成块的子数组其中最大值小于 i 那么对这个子数组进行排序后最后一个值即为maxval且其下标标定位i 子数组最开始的那个下标设为j, 那么子数组中应该有 i - j 1个元素 又根据成块的定义这里将会缺少自然数填满i - j 1个位置矛盾 故想要成块子数组的最大值不能小于 i
下面以图示的方法进一步说明假设红线前的0 1 2已经成块了 如果 nums[7] 7 那么一定不能成块因为此时只能有 6 5 4 3 2 1 0 能放入这8个黑框中 规律2. 以nums[i]为结尾的成块的子数组其中的最大值不能大于 i 证明与上面类似矛盾之处在于如果最大值大于 i 则将会多出来一个元素
所以要想成块只能是maxval i
class Solution {
public:int maxChunksToSorted(vectorint arr) {int n arr.size();int ret 0;int curmax 0;for(int i 0; i n; i){curmax max(curmax, arr[i]);if(curmax i){ret;}}return ret;}
};