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

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

size 算法學習 末尾 最小 條件 求最大值 sca 位數 技術

算法描述

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

算法思路

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

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

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

例如 16489657 刪除4個數字
首先比較1和6 刪除1 得到 6489657
之後,再次比較 6和4 往後推 可得到 689657
以此類推 刪除4個數字之後 可得到 9657

這裏會有個特殊情況,當一個從大大小的整數輸入的時候,我們得從末尾刪除數字才能得到最大值

例如 98765 刪除5 可以得到最大值 9876

算法實現

    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));
    }
    
    

結果

技術分享圖片

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