leetcode 402. Remove K Digits 贪心算法 + DFS深度优先遍历
来源:互联网 发布:如何禁用端口 编辑:程序博客网 时间:2024/06/10 05:38
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.
Note:
The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.
Example 1:
Input: num = “1432219”, k = 3
Output: “1219”
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
Example 2:
Input: num = “10200”, k = 1
Output: “200”
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
Example 3:
Input: num = “10”, k = 2
Output: “0”
Explanation: Remove all the digits from the number and it is left with nothing which is 0.
题意很简单,就是去掉k个bit,然后求剩下的值的所有可能中的最小值,第一个想到的方法就是和上一道题的DFS深度优先遍历的做法,但是会超时,我隐隐约约感觉到可能使用stack等来解决,但是不会做,于是网上找了个做法,
建议和leetcode 738. Monotone Increasing Digits 最大单调递增数字 一起学习
代码如下:
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <climits>#include <algorithm>#include <sstream>#include <bitset>using namespace std;class Solution {public: string removeKdigits(string num, int k) { if (k >= num.size()) return "0"; string res = ""; int count = k; for (char c : num) { while (count > 0 && res.size() > 0 && res.back() > c) { res.pop_back(); count--; } res.push_back(c); } res = res.substr(0,num.length()-k); while (res.empty()== false && res[0] == '0') res.erase(res.begin()); return res.length()<=0 ? "0" : res; } //和上一道题一样,就是一个DFS做法,但是会超时 vector<int> all; string removeKdigitsByDFS(string num, int k) { if (k >= num.length()) return "0"; vector<int> bit(num.length(), 0); vector<int> flag(num.length(), 0); for (int i = 0; i < bit.size(); i++) bit[i] = (int)(num[i] - '0'); getAll(0,k, flag, bit); int minRes = numeric_limits<int>::max(); for (int one : all) minRes = min(minRes, one); return to_string(minRes); } void getAll(int begin,int k,vector<int>& flag,vector<int>& bit) { if (k == 0) { int a = 0; for (int i = 0; i < bit.size(); i++) { if (flag[i] == 0) a = a * 10 + bit[i]; } all.push_back(a); } else if (begin >= flag.size()) return; else { getAll(begin + 1, k, flag, bit); flag[begin] = 1; getAll(begin + 1, k - 1, flag, bit); flag[begin] = 0; } }};
- leetcode 402. Remove K Digits 贪心算法 + DFS深度优先遍历
- 【Leetcode】402. Remove K Digits
- leetcode 402. Remove K Digits
- LeetCode 402. Remove K Digits
- [LeetCode]402. Remove K Digits
- leetcode 402. Remove K Digits
- LeetCode 402. Remove K Digits
- [leetcode]402. Remove K Digits
- LeetCode 402. Remove K Digits
- LeetCode 402. Remove K Digits
- [LeetCode] 402. Remove K Digits
- [LeetCode]402. Remove K Digits
- LeetCode 402. Remove K Digits
- leetcode-402. Remove K Digits
- leetcode 402. Remove K Digits
- Leetcode: 402. Remove K Digits
- 算法:402. Remove K Digits
- 402. Remove K Digits(贪心)
- SpringBoot报错(五) Failed to load ApplicationContext (2)
- Android线程池
- [BFS][哈希]Magic Squares 魔板
- linux查看历史命令history
- Jquery实现input keydown回车触发事件(任意触发、指定触发)
- leetcode 402. Remove K Digits 贪心算法 + DFS深度优先遍历
- Android SD卡存储封装类
- 【Spark】worker、executor、stage、task、partition关系
- spark(6)-spark RDD(course14)
- SQLite 约束
- 关于iview的使用心得
- 关于Android studio3.0的坑之butterknife 7.0.1(低版本)
- 关于oralce簇表的介绍
- Linux命令scp与tar