738. 单调递增的数字(中等,贪心)

题目链接:738. 单调递增的数字
738. 单调递增的数字(中等,贪心)
思路一:暴力破解,每次减1一个一个数判断

class Solution {
	//暴力破解  
	//时间复杂度:O(nm)  m为n的数字长度
	//空间复杂度:O(1)
public:
	bool checkNum(int num) {
		int low_pos = 10;

		while (num) {
			int temp_pos = num % 10;

			if (low_pos >= temp_pos) low_pos = temp_pos;
			else return false;      //如果低位比高位小 false

			num = num / 10;
		}

		return true;
	}

	int monotoneIncreasingDigits(int N) {
		for (int i = N; i > 0; i--) {    //一个一个判断
			if (checkNum(i)) return i;
		}
		return 0;
	}
};

思路二:贪心

class Solution {
public:
	int monotoneIncreasingDigits(int N) {
		string strNum = to_string(N);   //数字转字符串  string头文件的函数

		// flag用来标记赋值9从哪里开始
		// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
		int flag = strNum.size();
		for (int i = strNum.size() - 1; i > 0; i--) {    //必须从后面遍历到前面  反过来实现不了
			if (strNum[i - 1] > strNum[i]) {  //前一位>后一位
				flag = i;                     //后一位改9
				strNum[i - 1]--;              //332   ->  322   ->  222
			}
		}

		for (int i = flag; i < strNum.size(); i++) {  //标记位置开始改9
			strNum[i] = '9';
		}

		return stoi(strNum);  //字符串转数字
	}
};
上一篇:2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)


下一篇:2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)