《力扣算法訓練提升》圖解數組篇-打卡數組統計-【435】最小移動次數使數組元素相等
數組的基本特性
數組是最簡單的數據結構。
數組是用來存儲一系列相同類型數據,數據連續存儲,一次性分配內存。
數組中間進行插入和刪除,每次必須搬移后面的所有數據以保持連續,時間復雜度 O(N)。
囧么肥事今日打卡題目
力扣【435.最小移動次數使數組元素相等】
給定一個長度為 n 的 非空 整數數組,每次操作將會使 n - 1 個元素增加 1。找出讓數組所有元素相等的最小操作次數。
具體描述
解題討論
跨步計算示例
討論歸納
第一步:排序
第二步:遍歷數組,計算跨步,即最大值和最小值差值
第三步:累加跨步
動畫模擬
示例一:跨步計算
// 排序后計算跨步,最大值到最小值跨步累加就是操作次數
public static int minMoves(int[] nums) {
// 4 1 9 3
// 1 3 4 9 排序后
// 9 11 12 9 跨步:8
// 12 14 12 12 跨步:3
// 14 14 14 14 跨步:2
Arrays.sort(nums);
int count = 0;
int min = nums[0];
int step = 0;
for (int i = nums.length - 1; i > 0; i--) {
// 計算跨步 = 最大最小差值
step = nums[i] - min;
// 累加跨步
count += step;
// 更新 nums[i - 1]
nums[i - 1] = nums[i - 1] + count;
// 更新最小數
min += step;
}
return count;
}
復雜度分析
時間復雜度:O(nlog(n))。 排序需要 O(nlog(n)) 的時間。
空間復雜度:O(1)。需要常量級額外空間。
示例二:計算相對跨步
// 省略數組元素修改
// 計算相對跨步
public static int minMoves(int[] nums) {
Arrays.sort(nums);
int count = 0;
for (int i = nums.length - 1; i > 0; i--) {
count += nums[i] - nums[0];
}
return count;
}
復雜度分析
時間復雜度:O(nlog(n))。 排序需要 O(nlog(n)) 的時間。
空間復雜度:O(1)。需要常量級額外空間。
短話長說
學算法先學什么?什么階段該刷什么題?
關注我,日常打卡算法圖解。
按照力扣題目類別結構化排序刷題,從低階到高階,圖解算法(更新中…),有興趣的童鞋,歡迎一起從小白開始零基礎刷力扣,共同進步!
回復:678,獲取已分類好的部分刷題順序,后續內容會持續更新,感興趣的小伙伴自由拿取!
另外,有關分類,求小伙伴們不要再問我最后一類的起名了,奇技淫巧是個褒義詞,意思是指新奇的技藝和作品。
力扣修煉體系題目,題目分類及推薦刷題順序及題解
目前暫定划分為四個階段:
算法低階入門篇--武者鍛體
算法中級進階篇--武皇煉心
算法高階強化篇--武帝粹魂
算法奇技淫巧篇--戰斗秘典
以上分類原諒我有個修仙夢...
缺漏內容,正在努力整理中…