leetcode-402-remove k digits-移掉k位数字

 

 

 

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:

    num 的长度小于 10002 且 ≥ k。
    num 不会包含任何前导零。

示例 1 :

输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

示例 2 :

输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。

题目要求:移掉k个数字,使得剩下的数字最小;本质是局部重复性的变化问题,每次在可选范围内移掉一个数字,每移掉一个最小数字;如此往复。

题目本质:贪心问题,明确局部问题,每次做出局部最优解;开始index,遍历长度,最小值,最小值所在的index,遍历边界;

应用:贪心问题,重复性处理的问题,局部方法一样,条件有变化的如此处理。

问题:开始为0的处理,处理一批情况。每次局部处理可选的范围大小。

 

 

 

package com.jd.jr.nlp;

import java.util.ArrayList;
import java.util.List;

/**
 *   while遍历,确定可选范围 内的最小数,
 *   之后根据最小数下移,如此往复
 *
 *
 */

public class Solution402Diy {
    public String removeKdigits(String num, int k) {
        if(k==0){
            return num;
        }
        if(num.length()==k){
            return "0";
        }
        int[] digits=new int[num.length()];
        for(int i=0;i minDigits=new ArrayList<>();
//        int differNum=num.length()-k+1;
        int differNum=k+1;
        int i=0;
        int s=0;
        int minNumValue=Integer.MAX_VALUE;
        int minNumPosition=-1;
        while (true){
            if(minDigits.size()==num.length()-k){
                break;
            }
            if(i-s

 

你可能感兴趣的:(leetcode,java)