Algorithm --> n位数去掉k位后找最小数
去掉K位求取最小数
一个n位的数,去掉其中的k位,怎样使留下来的(n-k)位数按原来的前后顺序组成的数最小
例如
8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123。
解决方案
贪心算法,在每次被访问的位置保证有最优解。
思路一
分析:求一共n位,求其中的m位组成的数最小。那么这个m位的数,最高位应该在原数的最高位到第m位区间找,要不然就不能当第m位了,如下图(得到3位数最小,要是百位数在25中找,就当不了百位数了):

同样找十位数时只能在百味数到目前位置中间搜,整个过程图示如下:

注意
在区间有多个最小值,取距离最大的,保证下一位数有足够大的查找空间。
参考代码
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;
int *q; int findMinIndex(int arr[], int beg, int end) //[]
{
if(beg > end)
return -;
int minv = arr[beg];
int minIndex = beg;
for(int i = beg + ; i <= end; ++i)
{
if(arr[i] < minv)
{
minv = arr[i];
minIndex = i;
}
}
return minIndex;
} int getRemain(int arr[], int size, int k)
{
assert(size > k && k >= );
int rev = , revIndex = -;
for(int i = size - k; i < size; ++i)
{
revIndex = findMinIndex(arr, revIndex + , i);
rev = rev * + arr[revIndex];
}
return rev;
} int main()
{
int arr[] = {, , , , , , };
size_t size = sizeof(arr) / sizeof(int); int remainNum;
for (int k = size-; k > ; --k)
{
int remainNum = getRemain(arr, size, size - k);
cout << "When k = " << k << ", the remaining value is:" << remainNum << endl;
} }
结果

分析
时间复杂度O(KN)
思路二
分析:从前往后找,每次访问一位,比较该位前边的数,如果比该位大,果断干掉,例如:

同样以此往后遍历,知道干掉个数为k或访问到最后了,整个过程图示如下图。当然遍历到最后还没有干掉K个元素,说明剩下的已经为升序了,这样就在留下的数中取出前(n-k)个,整合成整数就是最小值。

参考代码
#include <iostream>
#include <cassert>
using namespace std; int getRemain(int *arr, int size, int k)
{
assert(size > k && k > );
int tmp = size - k;
int cur = , pre;
int rev = ;
while(k != && cur < size)
{
pre = cur - ;
while(pre >= )
{
if(arr[pre] >= arr[cur])
{
for(int i = pre; i < size; ++i)
arr[i] = arr[i+];
--cur;
--k;
--size;
}
--pre;
}
++cur;
} for(int i = ; i < tmp; ++i)
{
rev = rev * + arr[i];
}
return rev;
} int main()
{
int arr[] = {, , , , , , };
size_t size = sizeof(arr) / sizeof(int); int remainNum;
remainNum = getRemain(arr, size, );
cout << "When k = " << << ", the remaining value is:" << remainNum << endl;
}
分析
时间复杂度O(KN)
Algorithm --> n位数去掉k位后找最小数的更多相关文章
- [LeetCode] Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- [LeetCode] 402. Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”a ...
- 整数m去掉n位后剩下最大(小)值
题目描述 给定一个正整数(<=255位),从中删去n位后,使得剩下的数字组成的新数最小(大): 思路:从左到右开始扫描,两两比较,如果是前一位比后一位大,则删去前大的一位,直到删完所有的n位: ...
- 编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
function digit(num,k){ var knum = 0; for(var i=1; i<=k; i++){ knu ...
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 取n的第k位
实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算.即把需要第几位就右移几位. 例子: 0000 1000 ------8右移3位 0000 0 ...
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123. 解决方案 贪心算法,在每次被访问的位置保证有最优解. 思路一 分析:求一共n位,求其中的m位组成的数最小 ...
- Hulu面试题解答——N位数去除K个数字(解法错误sorry)
给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...
随机推荐
- Caused by:org.hibernate.MappingNotFoundException:resouce:com/you/model/Monkey.hbm.xml not found
1.错误描述 Caused by:org.hibernate.MappingNotFoundException:resouce:com/you/model/Monkey.hbm.xml not fou ...
- pat1091-1100
1091bfs傻逼题,dfs会爆栈 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- hdu5730 Shell Necklace
重温了这道cdq+FFT 讲白了就是不断对 dp[l~mid] 和 sh[1~r] 进行fft 得到 dp[mid+1~r] #include<bits/stdc++.h> using n ...
- Qt5.6.0+OpenGL 纹理贴图首战告捷
重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...
- 一:学习Linux前准备工作
1:虚拟机,网站上有很多种类的虚拟机,找一款适合自己用的.我这里使用的是 Virtual Box 下载地址:https://www.virtualbox.org/ 安装虚拟机 一路 Next 就可以. ...
- Python基础_函数2
在介绍完函数的大体概念如定义.传参.作用域之后,本节主要介绍函数的几个细节部分. 一. print()函数与return的区别. 相同点:print与return都是向用户在输出界面上展示结果 不同点 ...
- RobotFramework自动化测试框架的基础关键字(二)
1.1.1 如何快速查询某一个关键字的API说明 鼠标选中我们关键字,同时按住Ctrl+Alt键,即可出来该关键字的帮助API以及使用示例 1.1.2 如何快速补全关键字 ...
- _vimrc 的配置
windows set nocompatible set guifont=Consolas:h17 color molokai set backspace=2 set sts=4 set ts=4 s ...
- [SCOI2007]蜥蜴
网络流 一个点拆成两个,注意要把某一类边连反过来 这样才能保证有限制 # include <bits/stdc++.h> # define IL inline # define RG re ...
- oracle使用中的一些问题
一.设置自增主键(假设表的主键名为:company_id) 1)创建序列(company_autoinc): maxvalue start increment nocache; 2)创建触发器(com ...