1. 程式人生 > >演算法學習——貪心演算法之刪數字(求最小值)

演算法學習——貪心演算法之刪數字(求最小值)

演算法描述

在給定的n位數字,刪除其中的k位數字( k < n),使得最後的n-k為數字為最小值(原次序不變)

演算法思路

  1. 考慮到是要移出數字,我們使用連結串列設計此演算法較為方便,連結串列可以直接移出某個位置的元素

  2. 使用貪心演算法,每一步都要達到最優

  3. 從最高位開始,若下一位比上一位要小,則將上一位的數字移出,結束之後再次從最高位開始

這裡需要注意,會有特例

當輸入從小到大的的一個數的時候,上述演算法將會無法執行,比如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));
    }
    
    

結果