当前位置:网站首页>leetcode:402. 移掉 K 位数字
leetcode:402. 移掉 K 位数字
2022-08-09 04:42:00 【OceanStar的学习笔记】
题目来源
题目描述
题目解析
题意
要求从一个字符串数字中删除k个数字,使得剩下的数最小。也就是说,我们要保存原来的数字的相对位置不变
以题目中的 num = 1432219, k = 3 为例,我们需要返回一个长度为4的字符串。问题是:我们怎么才能求出这四个位置依次是什么呢?
思路
暴力法的话,我们需要枚举 C n ( n − k ) C_n^{(n - k)} Cn(n−k) 种序列(其中 n 为数字长度),并逐个比较最大。这个时间复杂度是指数级别的,必须进行优化。
一个思路是:
- 从左到右遍历
- 对于每一个遍历到的元素,我们决定是丢弃还是保留
问题是:我们怎么知道,一个元素是应该丢弃还是保留呢?
前置知识:
- 对于两个数 123a456 和 123b456
- 如果a > b,那么数字 123a456 > 123b456;
- 如果a < b,那么数字 123a456 < 123b456;
- 也就是说,两个相同位数的数字大小关系取决于第一个不同的数的大小
因此我们的思路就是:
- 从左到右遍历
- 对于遍历到的元素,我们选择保留。 但是我们可以选择性丢弃前面相邻的元素。丢弃与否的依据如上面的前置知识中阐述中的方法。
- 也就是说,对于遍历到的元素(从第二个元素开始),与前面的元素进行比较
- 如果比前一个元素小,就把前一个元素[替换成当前小的元素]
- 如果大于等于前一个元素,则该元素直接拼接到最后面
以题目中的 num = 1432219, k = 3 为例的图解过程如下:
由于没有左侧相邻元素,因此没办法丢弃。
由于 4 比左侧相邻的 1 大。如果选择丢弃左侧的 1,那么会使得剩下的数字更大(开头的数从 1 变成了 4)。因此我们仍然选择不丢弃(因为字典序要求最小)
由于 3 比左侧相邻的 4 小。 如果选择丢弃左侧的 4,那么会使得剩下的数字更小(开头的数从 4 变成了 3)。因此我们选择丢弃。
…
然而需要注意的是,如果给定的数字是一个单调递增的数字,那么我们的算法会永远选择不丢弃。这个题目中要求的,我们要永远确保丢弃 k 个矛盾。
一个简单的思路是:
- 每次丢弃一次,k减去1。当k减到0时,我们提前终止遍历
- 而当遍历完成,如果k仍然大于0。不妨假设最终还剩下x个需要丢弃,那么我们需要选择删除末尾 x 个元素。
上面的思路可行,但是稍显复杂。
我们需要把思路逆转过来。刚才我的关注点一直是丢弃,题目要求我们丢弃 k 个。反过来说,不就是让我们保留 n - kn−k 个元素么?其中 n 为数字长度。 那么我们只需要按照上面的方法遍历完成之后,再截取前n - k个元素即可。
按照上面的思路,我们来选择数据结构。由于我们需要保留和丢弃相邻的元素,因此使用栈这种在一端进行添加和删除的数据结构是再合适不过了
边栏推荐
猜你喜欢
做现货白银前这些要诀应先记起来
etcd学习笔记 - 入门
Alibaba Cloud Tianchi Contest Question (Machine Learning) - Prediction of Industrial Steam Volume (Complete Code)
ceph创建存储池,映射,删除练习
【数学】点积与叉积
[21天学习挑战赛——内核笔记](四)——内核常见调试手段(printf、dump_stack、devmem)
容易混淆的指针知识点
Construction and practice of full stack code test coverage and use case discovery system
「竞品分析报告」不会写?不知从哪收集数据?请收下这篇竞品指南
单根k线图知识别以为自己都懂了
随机推荐
Ridge regression and LASSO regression
杰理之电话打入,远端听不到声音【篇】
助力To B业务,这类企业端数据值得风控童鞋关注
MySql.Data.MySqlClient.DBNull
2分钟,带你走完企业经营分析全流程,更有通用分析框架直接套用
337. 打家劫舍 III
EDI对接 New York & Company案例
union
Device Reliability vs. Temperature
MySQL:redo log日志——笔记自用
做现货白银前这些要诀应先记起来
2022 High Voltage Electrician Exam Questions and Answers
[OpenCV] - Find and draw contours
安装pytorch和cuda
杰理之采用mix out eq 没有作用【篇】
TASSEL软件导入plink格式文件报错
“error“: { “root_cause“: [{ “type“: “circuit_breaking_exception“, “reason“: “[parent] D [solved]
Ali YunTianChi competition problem (machine learning) - ali cloud security malware detection (complete code)
337. Robbery III
杰理之一拖二 另一台手机超距 通话会无声【篇】