貪婪策略 數字去掉幾位求最小值實現

2021-09-02 02:11:48 字數 1880 閱讀 8194

在位數固定的前提下,讓高位的數字盡量小,其值就較小。依據此貪婪策略就可以解決這個問題。

如何根據貪婪策略刪除數字呢?總目標是刪除高位較大的數字,具體地相鄰兩位比較,若高位比低位大則刪除高位。

**一般實現:

package com.demo.test.util;

/** * @description: 給定乙個整數,刪除k個數後,使得剩餘值最小

* @author: fengze

* @create: 2018-11-28 11:37

**/public class testremovebig

//外層迴圈控制刪除次數

for (int j = 0; j < k; j++)

}//未刪除數時,將最後乙個值刪除

if (!flag)

//移除前面為0的所有數值

removezero(value);

}if (value.length() == 0)

return value;

}private static void removezero(string value)

}public static void main(string args)

}

效率分析:

1.每一次內層迴圈,都需要從頭遍歷所有數字

2.substring方法本身效能不高

substring方法的底層實現,涉及到了新字串的建立,以及逐個字元的拷貝。這個方法自身的時間複雜度是o(n)。因此,我們應該避免在每刪除以後數字後就呼叫substring方法。

高效率實現:

package com.demo.test.util;

/** * @description: 給定乙個整數,刪除k個數後,使得剩餘值最小(優化實現方案)

* @author: fengze

* @create: 2018-11-28 13:38

**/public class testremovebigoptimal

//刪除後剩餘位數

int newlenth = value.length() - k;

//使用陣列將剩餘元素收集

char newvalue = new char[newlenth];

//棧頂元素

int stacktop = 0;

//遍歷元素,將符合要求的刪除,不符合要求的放入陣列中

for (int i = 0; i < value.length() ; i++)

//更換符合要求數值

newvalue[stacktop++] = value.charat(i);

}//找到陣列中第乙個非0數值

int zeronum = 0;

while(zeronum < newlenth && newvalue[zeronum] == '0')

//返回結果

return zeronum == newlenth ? "0" : new string(newvalue,zeronum,newlenth-zeronum);

}public static void main(string args)

}

**中非常巧妙地運用了棧的特性,在遍歷原整數的數字時,讓所有數字乙個個入棧,當某個數字需要刪除時,讓該數字出棧。最後,程式把棧中的元素轉化為字串結果。

**只對所有數字遍歷了一趟,遍歷的時間複雜度是o(n),而後把棧轉化為字串的時間複雜度也是o(n),所以最終的時間複雜度是o(n)

同時,程式中利用棧來回溯遍歷過的數字以及刪除數字,所以程式的空間複雜度是o(n)

刪除數字求最小值(貪心)

演算法分析 我們可以很容易的發現該題目可以使用貪心演算法。比如,上述正整數5476579228,要刪除k 4個數字獲得乙個最小的6位數字。然而我們知道剩下的6位數的首位不可能從54765 79228不可能從79228中得到 why?因為題目要求要按照原來正整數的左右次序排列,如果在79228中刪除後...

去掉最大值和最小值後求平均值的公式

去掉最大值和最小值後求平均值的公式 在一些競賽活動中,經常看到裁判現場打分的情況,為了保證競賽公平,通常在所有裁判給出的分數中去掉乙個或幾個最高和最低分,然後用剩餘的分數取平均得到參賽選手的最後得分。這一點在excel中用trimmean函式就可以輕鬆實現。trimmean函式先從資料集的頭部和尾部...

求一列數字的分割槽最大值與最小值

我有乙個表 num 001 002 003 004 007 008 009 我想讓他們變成區間形式 a b 001 004 007 009 如何才能辦到,我需要的是一條sql語句 declare ttable num varchar 10 insert into tselect 001 insert...