java
題目是:面試
「曾經有兩次消除的機會擺在我面前,我卻沒有珍惜……」牛牛回憶道。算法
牛牛正在玩一款全新的消消樂遊戲。這款遊戲的主體是由一列列的方塊構成,牛牛的目標就是要儘可能消除這些方塊。數組
每次操做,牛牛能夠選擇某個高度 x,將全部高度大於等於 x 的那些列所有消除 x 個方塊,隨後方塊會下落,以填補消除形成的空白。架構
牛牛這一局的發揮極佳,眼看就要破紀錄了,卻發現本身只剩下了兩次消除機會。函數
爲了避免錯失這百年不遇的機會,他決定寫個程序來算出最優解。學習
簡明題意:spa
給定一個數組 nums,其中有 n 個非負整數。你的目的是進行兩次操做,使得數組的元素之和最小。code
每次操做形如:任選一個整數 x ,將數組中全部視頻
示例1
[2, 1, 3]
0
初始數組爲 [2, 1, 3]。
先選擇 x = 2,則全部大於等於 2 的元素減去 2 ,變成 [0, 1, 1]。
再選擇 x = 1,則全部大於等於 1 的元素減去 1 ,變成 [0, 0, 0]。
因此數組元素之和的最小值爲 0。
import java.util.*; public class Solution { /** * 返回兩次操做後,數組元素之和的最小值 * @param nums int整型一維數組 這你你須要操做的數組 * @return long長整型 */ public long minimumValueAfterDispel (int[] nums) { // write code here Arrays.sort(nums); long sum = 0;//記錄整個數組的和 long max = 0;//記錄可以減去的最大值 for(int j=0;j<nums.length;j++){ sum += nums[j]; int index1 = j; int index2 = j; int index3 = j; for(int i=0;i<=j;i++){ while(index1 > 0 && nums[index1-1] >= nums[j]-nums[i]){ index1--; } while(index2 > i && nums[index2-1] >= nums[j]-nums[i]){ index2--; } while(index3 < nums.length && (long)nums[index3] < (long)nums[i]+nums[j]){ index3++; } /* 假設兩次減去的數爲a,b(a<b)總共分爲三種狀況 1.a=nums[j]-nums[i] b=nums[i] 2.a=nums[i] b=nums[j]-nums[i] 3.a=nums[i] b=nums[j] 分段函數的邊界: 1. index1 < i < j < nums.length 其實index1大於i時不礙事 i-index1變成負數不會影響max的計算 2. i < index2 < j < nums.length 3. i < j < index3 < nums.length 對於第一種狀況 index1到i之間的數只能減去a 即 nums[j]-nums[i], i到j之間的數只能減去b 即nums[i] , j到最後的數能夠減去a+b 即nums[j] 對於第二種狀況 i到index2之間的數只能減去a 即 nums[i], index2到j之間的數只能減去b 即nums[j]-nums[i] , j到最後的數能夠減去a+b 即nums[j] 對於第三種狀況 i到j之間的數只能減去a 即 nums[i], j到index3之間的數只能減去b 即nums[j], index3到最後的數能夠減去a+b 即nums[j]+nums[i] */ long tmp1 = (i-index1)*((long)nums[j]-nums[i]) + (j-i)*(long)nums[i] + (nums.length-j)*(long)nums[j]; long tmp2 = (index2-i)*((long)nums[i]) + (j-index2)*((long)nums[j]-nums[i]) + (nums.length-j)*(long)nums[j]; long tmp3 = (j-i)*(long)nums[i] + (index3-j)*(long)nums[j] + (nums.length-index3)*((long)nums[i]+nums[j]); max = Math.max(max,tmp1); max = Math.max(max,tmp2); max = Math.max(max,tmp3); } } return sum - max; } }
你們有什麼好的解法也能夠在評論區說出來
最後我把我收集的各大廠經典高頻面試題和Java高級進階、架構師視頻教程送予你們。部分資料以下圖所示:
獲取地址: