2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最多能挑选几个数。 来自美团。
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字,
但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。
返回你最多能挑选几个数。
来自美团。
答案2022-05-23:
排序,去重。
第1种情况:不要i,dp[i]=dp[i-1]。
第2种情况:要i,
相邻差2,dp[i]=dp[i-1]+1。
相邻差1,dp[i]=dp[i-2]+1。
时间复杂度:排序的。
额外空间复杂度:O(N)。
代码用rust编写。代码如下:
use rand::Rng;
fn main() {
let mut len: i32 = 10;
let mut value: i32 = 20;
let mut test_time: i32 = 2000;
println!("测试开始");
for i in 0..test_time {
let n: i32 = rand::thread_rng().gen_range(0, len) + 1;
let mut arr = random_array(n, value);
let ans1 = longest_uncontinuous1(&mut arr);
let ans2 = longest_uncontinuous2(&mut arr);
if (ans1 != ans2) {
println!("出错了!");
for num in &arr {
print!("{} ", num);
}
println!("");
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
}
fn longest_uncontinuous1(arr: &mut Vec<i32>) -> i32 {
if arr.len() == 0 {
return 0;
}
arr.sort_unstable();
let mut pa: Vec<i32> = vec![];
for _i in 0..arr.len() {
pa.push(0);
}
return process1(arr, 0, &mut pa, 0);
}
fn process1(arr: &mut Vec<i32>, i: i32, path: &mut Vec<i32>, j: i32) -> i32 {
if i == arr.len() as i32 {
for k in 1..j {
if (path[(k - 1) as usize] + 1 >= path[k as usize]) {
return 0;
}
}
return j;
} else {
let mut p1 = process1(arr, i + 1, path, j);
path[j as usize] = arr[i as usize];
let mut p2 = process1(arr, i + 1, path, j + 1);
return get_max(p1, p2);
}
}
// 最优解
fn longest_uncontinuous2(arr: &mut Vec<i32>) -> i32 {
if arr.len() == 0 {
return 0;
}
arr.sort_unstable();
let n = arr.len() as i32;
let mut size: i32 = 1;
for i in 1..n {
if arr[i as usize] != arr[(size - 1) as usize] {
arr[size as usize] = arr[i as usize];
size += 1;
}
}
let mut dp: Vec<i32> = vec![];
dp.push(1);
let mut ans: i32 = 1;
for i in 1..size {
dp.push(1);
if arr[i as usize] - arr[(i - 1) as usize] > 1 {
dp[i as usize] = 1 + dp[(i - 1) as usize];
}
if i - 2 >= 0 && arr[i as usize] - arr[(i - 2) as usize] > 1 {
dp[i as usize] = get_max(dp[i as usize], 1 + dp[(i - 2) as usize]);
}
ans = get_max(ans, dp[i as usize]);
}
return ans;
}
fn get_max(a: i32, b: i32) -> i32 {
if a > b {
a
} else {
b
}
}
// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
let mut arr: Vec<i32> = vec![];
for _i in 0..n {
arr.push(rand::thread_rng().gen_range(0, v) - rand::thread_rng().gen_range(0, v));
}
return arr;
}
执行结果如下:
2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最多能挑选几个数。 来自美团。的更多相关文章
- 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...
- 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]
[来源]:腾讯2013实习生笔试 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j])空间复杂度和O(n)的时间复杂度:除遍历计数器与a ...
- Math.abs为Integer.Min_VALUE返回错误的值
Math.abs为Integer.Min_VALUE返回错误的值 这段代码: System.out.println(Math.abs(Integer.MIN_VALUE)); 回报-2147483 ...
- 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等
题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...
- 给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
对于N阶幻方,从1开始把数字从小到大按以下规则依次写入: 一.在第一行中间一列写入1 二.依次向右上方写入2.3.4...... 三.如果某数字写在了表格的某个方向外面,那就把这个数字向相反方向移动N ...
- 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1 ...
- 给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)
第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] ...
随机推荐
- discuz论坛或门户下载的图片无法显示?
discuz论坛或门户下载的图片无法显示? 使用某些插件或者软件(例如火车头采集器,简数采集工具等)的图片下载功能,发现下载成功了后台也有但是前台无法显示,捣鼓了一轮最终才发现是路径的问题. disc ...
- [picoCTF]Scavenger Hunt write up
http://mercury.picoctf.net:5080/,这个网站周围隐藏着一些有趣的信息.你能找到它吗? 根据提示: 您应该有足够的提示来查找文件,不要运行暴力破解程序. 点击链接,进入页面 ...
- 说一下在写Android APP时遇到的具体问题
问题一:总是显示出no such table错误 不要担心这个问题(该担心还是得担心一下的哈),以我出错多次的经验来看,只需要在运行APP之后,回到虚拟机的主界面,然后找到相应的APP虚拟软件,将他删 ...
- 关于jsp页面中的小细节们
细节一:利用jsp判断文本框的输入格式是否正确 也就是主要利用script标签进行判断,主要用到的是正则表达式(判断是否为整数): 再加上if语句的配合,就能够在文本框的格式不正确时,发出错误警告啦! ...
- FastJson 反序列化漏洞原理分析
Fastjson 简介 fastjson框架:https://github.com/alibaba/fastjson fastjson-jndi:https://github.com/earayu/f ...
- 表现标准语言CSS3学习 入门+导入方式
表现标准语言CSS3学习 入门+导入方式 如何学习: css是什么 css怎么用(快速入门) css选择器(重点+难点) 美化网页(文字.阴影.超链接.列表.渐变...) 盒子模型 浮动 定位 网页动 ...
- PyQt5学习 (4)--QAbstractButton(下)
QAbstractBUtton: 所有按钮控件的基类 提供按钮的通用功能 继承自QWidget 属于抽象类别,不能直接去使用,必须借助于子类(除非你觉得子类不够用,想自定义一个按钮) ...
- Windows服务器高物理内存占用问题排察
我经常在手中拿着一个内存条手链,以彰显我是计算机深入挖掘专家,它就是一个象征,类似摸金符,有它代表你有资格可以探墓了. 同事找到我说:"我们有一台服务器,内存资源持续高位运行,经常浮动在80 ...
- blender资源库 【自用】
1 https://www.threedscans.com A Website with a lot of photo-scanned sculptures which are free to use ...
- MYSQL5.7.30安装
1.下载MySQL 我用的是5.7.30(安装版) 我选择的下载链接:https://dev.mysql.com/downloads/windows/installer/5.7.html 官网链接:h ...