h5制作哪个网站好,电商平台运营,沈阳专业网站建设报价,领卷网站怎么做的数组nums中的元素nums[ i ] 可以替换为任意两个数a, b, 前提是ab nums[ i ]. 把数组nums变为升序#xff08;可以有相等#xff09;数组需要多少次替换。
思路#xff1a;
排序数组是左边的元素右边元素#xff0c;以右边元素为边界。 所以从右到左遍历数组#xf…
数组nums中的元素nums[ i ] 可以替换为任意两个数a, b, 前提是ab nums[ i ]. 把数组nums变为升序可以有相等数组需要多少次替换。
思路
排序数组是左边的元素右边元素以右边元素为边界。 所以从右到左遍历数组最右边的元素不需要处理。
拆分的时候最好是平均分像10最好拆成5和511就拆成5和6 这样可以确保再往左遍历时右边的元素尽可能的大以减少拆分次数。 比如[5,10,8], 10最好拆成5和5得到[5,5,5,8], 那么只需要拆一次 如果把10拆成2和8得到[5,2,8,8] 那么最左边的元素5又要拆2次。
拆分出来的最小的数字最左边的数字就是下一元素的右边界。
假如右边界的数字为right, 那么拆分次数为cnt (nums[ i ] - 1) / right, 其中最小的数字为nums[i] / (cnt 1), 更新right为这个数。
如果nums[ i ]本身就right, 直接把right更新为nums[i], 进入下一遍历。
注意数值的范围结果要用long型。 public long minimumReplacement(int[] nums) {int n nums.length;int right nums[n-1];long res 0;for(int i n-2; i 0; i--) {if(nums[i] right) {int splitCnt (nums[i] - 1) / right;right nums[i] / (splitCnt 1);res splitCnt;} else {right nums[i];}}return res;}