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[] ...
随机推荐
- win8 改win7 最全教程(包含可能遇到的所有问题)
今日,帮一个朋友的把她的系统从win8 优雅降级到了win7,大家都知道win8改win7 不好改啊.......话不多,上本人的总结的教程. 首先 ,win8改win7 需要对系统格盘,这里的原因我 ...
- Trino Master OOM 排查记录
背景 最近线上的 trino 集群 master 节点老是因为 OOM crash,我们注意到 trino crash 前集群正在运行的查询数量正常,不太像是因为并发查询数据太多导致的 OOM.遂配置 ...
- 如何规避MyBatis使用过程中带来的全表更新风险
作者:京东零售 贾玉西 一.前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了. 程序员B: 咔,还没遇到过,这 ...
- c++的thread小测试
windows环境还用不了thread,得下一些mingw,弄了半天没弄好,直接用了商店中心就有的Ubuntu了,但是sudo install g++出现了下载不了的问题,解决方案:https://b ...
- maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android app
首先添加微信sdk的绑定库 nuget 包:Chi.MauiBinding.Android.WeChat 项目地址:https://github.com/realZhangChi/MauiBindin ...
- 【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系
并发编程的难题和挑战 在并发编程的技术领域中,对于我们而言的难题主要有两个: 多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息. 多线程的线程通信机制 在命令式编程中,线 ...
- new 的原理是什么?通过 new 的方式创建对象和通过字面量 创建有什么区别?
涉及面试题: new 的原理是什么?通过 new 的方式创建对象和通过字面量 创建有什么区别? 在调用 new 的过程中会发生四件事情 新生成了一个对象: 链接到原型: 绑定 this : 返回新对象 ...
- 2023年数字化经济与管理科学国际学术会议(CDEMS2023)
基本信息 大会官网:www.cdems.org 大会时间:2023年4月21-23日 大会地点:中国开封 截稿时间:2023年4月16日(此处有变动) 接受/拒稿通知:投稿后1周 收录检索:CPCI, ...
- Let和Const区别,详细版本
let:声明的是变量1.不存在变量提升 // var 的情况 console.log(foo); // 输出undefined var foo = 2; // let 的情况 console.log( ...
- ACM-CodeForces-#685(Div.2)
好久没见过CF有这么水的contest了,蒟蒻赶紧找找自信 A. Subtract or Divide #include<iostream> using namespace std; in ...