Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

738. 单调递增的数字 #81

Open
yankewei opened this issue Dec 15, 2020 · 1 comment
Open

738. 单调递增的数字 #81

yankewei opened this issue Dec 15, 2020 · 1 comment
Labels
中等 题目难度为中等 贪心算法 题目包含贪心解法

Comments

@yankewei
Copy link
Owner

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

输入: N = 10
输出: 9

示例 2:

输入: N = 1234
输出: 1234

示例 3:

输入: N = 332
输出: 299

说明: N 是在 [0, 10^9] 范围内的一个整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

@yankewei yankewei added the 贪心算法 题目包含贪心解法 label Dec 15, 2020
@yankewei
Copy link
Owner Author

我觉得这个题目最重要的就是理解单调递增的含义以及单调递增的最大值。假如有一个数字123454,把它改为单调递增的最大值就是123449。就是从前往后遍历,如果当前数字比下一个数字大,那么当前数字应该-1,后边的数字改为9即可。但是存在一个问题就是,如果当前数字减1之后比前一个数字小,比如332,按照上边的逻辑改完之后是329,不符合题目要求,因为2<3,那么需要把2改为9,3改为2,就是299

func monotoneIncreasingDigits(N int) int {
    s := []byte(strconv.Itoa(N))
    var i int
    b := false
    for i = 0; i < len(s)-1; i++ {
	if s[i] > s[i+1] {
	    b = true
	    break
	}
    }

    if !b {
	return N
    }

    // 把 i 之边的所有元素都设置为9
    for k := i + 1; k < len(s); k++ {
	s[k] = '9'
    }
    // 设置当前 i 的元素减去1
    s[i] = s[i] - 1
    // 设置i之前的元素
    for k := i; k > 0; k-- {
	if s[k] < s[k-1] {
	    s[k] = '9'
	    s[k-1] = s[k-1] - 1
	}
    }
    ans, _ := strconv.Atoi(string(s))
    return ans
}

@yankewei yankewei added the 中等 题目难度为中等 label Dec 15, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
中等 题目难度为中等 贪心算法 题目包含贪心解法
Projects
None yet
Development

No branches or pull requests

1 participant