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[] ...
随机推荐
- Anaconda与conda、pip与conda的区别 - 搬运
Anaconda与conda.pip与conda的区别 风影忍着 转自:https://zhuanlan.zhihu.com/p/379321816 作为一个Python初学者,在请教资深 ...
- sql Alias别名
sql语句中where.group by.having.order by 是否可以使用别名 1.在mysql中,group by.order by中可以使用别名:where中不能使用别名,(如果别名来 ...
- rabbit.bat server启动闪退,rabbitmq (ArgumentError) argument error,rabbitmq页面无法开启解决方案
步骤1:下载rabbitmq-plugins rabbitmq-plugins enable rabbitmq_managemen 步骤2:rabbitmq-service移除服务 rabbitmq- ...
- 一个小数据库SQLite
参考 https://blog.csdn.net/csdnhsh/article/details/93376733 https://www.runoob.com/sqlite/sqlite-creat ...
- OSPF与ISIS比较
- python计算三角形的三个边的边长,首先计算两个坐标点的距离
# -*- coding:utf-8 -*- """ @author: 14931 @file: trianglearea.py @time: 2023/02/14 @d ...
- Android studio 安装过程中SDK的环境配置问题
SDK的环境配置问题 在之前的某一篇中,我也提到过在Ecplise里面的SDK的环境配置,二者确实不太一样! 一.系统环境变量新增一个 变量名为:ANDROID_HOME 变量值为:浏览到下载SDK的 ...
- ABAC框架-casbin
参考文档:https://www.kancloud.cn/oldlei/casbin/1289455 参考博客:https://www.cnblogs.com/studyzy/p/11380736.h ...
- 如何基于 Agora Android SDK 在应用中实现视频通话?
在很多产品,实时视频通话已经不是新鲜的功能了,例如视频会议.社交应用.在线教育,甚至也可能出现在一些元宇宙的场景中. 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频 ...
- [C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程
不知不觉C++STL教程系列已经第7期了.之前我们介绍过:vector, queue, stack, set, map等等数据结构. 今天我们来学习一个新的stl容器:priority_queue优先 ...