2022-05-23:给定一个数组arr,你可以随意挑选其中的数字, 但是你挑选的数中,任何两个数a和b,必须Math.abs(a - b) > 1。 返回你最多能挑选几个数。 来自美团。
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。 返回你最多能挑选几个数。 来自美团。的主要内容,如果未能解决你的问题,请参考以下文章
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除几个数字能达到目的。 N <= 10^4
2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.
2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=
2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不