Java C++ 算法题解leetcode1608特殊数组特征值
作者:AnjaVon 发布时间:2023-05-21 21:09:01
标签:Java,C++,算法,特殊数组,特征值
题目要求
思路一:枚举 + 二分
逐一枚举值域内的所有值,然后二分判断是否合法。
Java
class Solution {
public int specialArray(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
for (int x = 0; x <= nums[n - 1]; x++) { // 枚举
int l = 0, r = n -1 ;
while (l < r) { // 二分
int m = l + r >> 1;
if (nums[m] >= x)
r = m;
else
l = m + 1;
}
if (nums[r] >= x && x == n - r)
return x;
}
return -1;
}
}
时间复杂度:O(n log n),排序复杂度为O(n log n),枚举次数为值域范围C=1000,所以找答案的复杂度为O(C log n)
空间复杂度:O(log n))
C++
class Solution {
public:
int specialArray(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
for (int x = 0; x <= nums[n - 1]; x++) { // 枚举
int l = 0, r = n -1 ;
while (l < r) { // 二分
int m = (l + r) >> 1;
if (nums[m] >= x)
r = m;
else
l = m + 1;
}
if (nums[r] >= x && x == n - r)
return x;
}
return -1;
}
};
时间复杂度:O(n log n),排序复杂度为O(n log n),枚举次数为值域范围C=1000,所以找答案的复杂度为O(C log n)
空间复杂度:O(log n)
思路二:二分枚举
二分枚举+二分判定是否合法;
为了方便把判断合法单独写成函数getResgetResgetRes。
Java
class Solution {
int[] nums;
public int specialArray(int[] num) {
this.nums = num;
Arrays.sort(nums);
int l = 0, r = nums[nums.length - 1];
while (l < r) {
int m = l + r >> 1;
if (getRes(m) <= m)
r = m;
else
l = m + 1;
}
return getRes(r) == r ? r : -1;
}
int getRes(int x) {
int n = nums.length, l = 0, r = n - 1;
while (l < r) {
int m = l + r >> 1;
if (nums[m] >= x)
r = m;
else
l = m + 1;
}
return nums[r] >= x ? n - r : 0;
}
}
时间复杂度:O(n log n),排序复杂度为O(n log n),二分找答案所以复杂度为O(log C log n)
空间复杂度:O(log n)
C++
注意全局变量和输入变量需要有差别……
class Solution {
public:
vector<int> nums;
int specialArray(vector<int>& num) {
this->nums = num;
sort(nums.begin(), nums.end());
int l = 0, r = nums[nums.size() - 1];
while (l < r) {
int m = (l + r) >> 1;
if (getRes(m) <= m)
r = m;
else
l = m + 1;
}
return getRes(r) == r ? r : -1;
}
int getRes(int x) {
int n = nums.size(), l = 0, r = n - 1;
while (l < r) {
int m = (l + r) >> 1;
if (nums[m] >= x)
r = m;
else
l = m + 1;
}
return nums[r] >= x ? n - r : 0;
}
};
时间复杂度:O(n log n),排序复杂度为O(n log n),二分找答案所以复杂度为O(log C log n)
空间复杂度:O(log n)
思路三:倒序枚举
因为值域比较小,所以可以直接从值域最后开始倒着枚举;
预处理出每个值出现的次数,然后记录当前合法合法数值的数量与当前数值进行比较。
Java
class Solution {
public int specialArray(int[] nums) {
int[] cnt = new int[1001];
for (int x : nums)
cnt[x]++;
for (int i = 1000, tot = 0; i >= 0; i--) {
tot += cnt[i]; // 数量
if (i == tot)
return i;
}
return -1;
}
}
时间复杂度:O(n+C)
空间复杂度:O(C)
C++
class Solution {
public:
int specialArray(vector<int>& nums) {
int cnt[1001];
memset(cnt, 0, sizeof(cnt));
for (int x : nums)
cnt[x]++;
for (int i = 1000, tot = 0; i >= 0; i--) {
tot += cnt[i];
if (i == tot)
return i;
}
return -1;
}
};
时间复杂度:O(n+C)
空间复杂度:O(C)
来源:https://juejin.cn/post/7142521741795917854


猜你喜欢
- 近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再
- 一个简单的拼图小游戏,供大家参考,具体内容如下1.首先设计视图面板。2.添加所需要的图片按钮。3.最主要的是设计监听事件,添加图片的监听按钮
- 在Android中使用ImageView显示图片的时候发现图片显示不正,方向偏了或者倒过来了。 解决这个问题很自然想到的分两步走: 1、自动
- SpringMVC RESTFul列表功能实现一、增加控制器方法在控制器类 EmployeeController 中,添加访问列表方法。@C
- 目录如何快速获取 相册分类一些异常情况的处理Recycleview-CursorAdapter还有必要用LoaderManager吗总结如何
- Eclipse 最佳字体 推荐:步骤:Eclipse->Windows[窗口]->Preferences[首选项]->Ge
- 背景:在写登录界面时,老板就觉得在输入密码的时候谈出来的输入法软键盘把登录按钮遮挡住了(入下图所示,不爽),连输入框都被挡了一半
- 一、万能的字符串当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:配置文件内容为:pkslow.admin=larry
- 协程源码的结构在研究Kotlin源码之前,得先搞懂Kotlin源码结构分布。不然找不到该看哪里的代码。看源码之前当然先得有一个目标,最好是带
- 批量添加一对多中间表建立中间表A,一个id对应多个lid;传入两条参数long id;//单个数值List lid;//集合数值dao层语句
- ForkJoin简介Fork/Join框架是Java 7提供的一种用于并行执行任务的框架,它将大任务分解为若干个小任务,并行执行这些小任务,
- 1.1.1 摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的
- 前言本文主要给大家介绍了关于如何实现Builder模式,大家在构建大对象时,对象的属性比较多,我们可以采用一个构造器或者使用空的构造器构造,
- 文章描述一般情况下,我们的日志文件是用来记录一些关键操作或者异常,并且是后台存储,并不对外开放的;但是也有些时候,特别是做一些小工具程序,需
- 新项目Android和ios要做成统一样式,年龄,性别,时间,要做成滚轮效果,Android没有原生控件,只能自己定义,于是我较劲脑汁,终于
- 本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法。分别调用方法extractText()和extractImages()来读取
- 在项目中,分页是一个项目中必不可少的,它可以防止我们从数据库中进行大量数据查询时速度变慢,提高我们的查询效率。1、定义分页模型:PageMo
- 前言:Java 中 hashCode() 和 equals() 的关系是面试中的常考点,如果没有深入思考过两者设计的初衷,这个问题将很难回答
- 本文实例为大家分享了Unity实现每日签到系统的具体代码,供大家参考,具体内容如下代码:using System;using System.
- Java是如何跳出当前多重循环?不建议使用在最外层前面加一个标记A,然后用break A;可以跳出多重循环因为它不会让你的程序变得更加优雅,