演算法學習——貪心演算法之刪數字(求最小值)
阿新 • • 發佈:2018-12-15
演算法描述
在給定的n位數字,刪除其中的k位數字( k < n),使得最後的n-k為數字為最小值(原次序不變)
演算法思路
考慮到是要移出數字,我們使用連結串列設計此演算法較為方便,連結串列可以直接移出某個位置的元素
使用貪心演算法,每一步都要達到最優
從最高位開始,若下一位比上一位要小,則將上一位的數字移出,結束之後再次從最高位開始
這裡需要注意,會有特例
當輸入從小到大的的一個數的時候,上述演算法將會無法執行,比如123456,刪除1個數字變為最小,我們把6刪去,這樣才是最小的(即從末尾刪除數字)
演算法實現
Scanner scanner = new Scanner(System.in); System.out.println("請輸入整數:"); String s = scanner.nextLine(); System.out.println("刪除數字的個數:"); int n = scanner.nextInt(); scanner.close(); int a[] = new int[s.length()]; for(int i=0;i<s.length();i++){ char temp =s.charAt(i); a[i] = temp -'0';//不減去‘0’則會獲得Ascii碼 } LinkedList<Integer> linkedList = new LinkedList<Integer>(); for(int i=0;i<a.length;i++){ linkedList.add(a[i]); } int flag =0; while(flag<n){ for(int i=0;i<linkedList.size()-1;i++){ if(linkedList.get(i)>linkedList.get(i+1)){ linkedList.remove(i);//使用連結串列移出元素 flag++; break;//結束本次迴圈,跳轉到while迴圈中 } //考慮到特殊情況,當遍歷完全部數字都不滿足條件,從末尾刪除數字 if(i==linkedList.size()-2){ linkedList.removeLast(); flag++; } } } System.out.print("擷取的"+n+"個數字後的最小值為"); for(int i=0;i<linkedList.size();i++){ System.out.print(linkedList.get(i)); }