2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 输入:arr = [2,3,4,7,11], k = 5。 输出:9
2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。
请你找到这个数组里第 k 个缺失的正整数。
输入:arr = [2,3,4,7,11], k = 5。
输出:9。
答案2023-05-16:
大体步骤如下:
1.初始化左指针l为0,右指针r为数组长度减一,定义中间指针m和find(找到第k个正整数前的下标位置),并将find初始化为数组长度。
2.当左指针小于等于右指针时,执行二分查找。令m等于左指针和右指针之间的中间值。(注:这里取中间值可以使用位运算优化)。
3.如果当前位置arr[m]减去(m+1)大于等于k,说明第k个缺失的正整数在当前位置左侧,更新find为当前位置m,并把右指针r设为m-1,继续二分查找左半部分。
4.如果当前位置arr[m]减去(m+1)小于k,说明第k个缺失的正整数在当前位置右侧,把左指针l设为m+1,继续二分查找右半部分。
5.查找结束后,如果find等于0,说明要找的是第一个缺失的正整数,返回0即可;否则,找到第k个正整数前的一个位置,把这个位置上的元素赋值给preValue,计算从当前位置到第k个正整数的缺失数量under,最终结果就是preValue加上k减去under的值。
6.返回结果。
时间复杂度为O(logn),其中n是数组的长度。因为代码采用了二分查找的算法,每次查找可以将搜索范围缩小一半,所以时间复杂度为O(logn)。
空间复杂度为O(1),因为代码只使用了常数个变量来存储中间结果,与输入数据的规模大小无关。因此,空间复杂度为常数级别。
go完整代码如下:
package main
import "fmt"
func findKthPositive(arr []int, k int) int {
l := 0
r := len(arr) - 1
m := 0
find := len(arr)
for l <= r {
m = (l + r) / 2
if arr[m]-(m+1) >= k {
find = m
r = m - 1
} else {
l = m + 1
}
}
preValue := 0
if find == 0 {
preValue = 0
} else {
preValue = arr[find-1]
}
under := preValue - find
return preValue + (k - under)
}
func main() {
arr := []int{2, 3, 4, 7, 11}
k := 5
result := findKthPositive(arr, k)
fmt.Println(result)
}

rust完整代码如下:
fn find_kth_positive(arr: Vec<i32>, k: i32) -> i32 {
let mut l = 0;
let mut r = arr.len() - 1;
let mut m = 0;
let mut find = arr.len();
while l <= r {
m = (l + r) / 2;
if arr[m] - (m as i32 + 1) >= k {
find = m;
r = m - 1;
} else {
l = m + 1;
}
}
let pre_value = if find == 0 { 0 } else { arr[find - 1] };
let under = pre_value - (find as i32);
return pre_value + (k - under);
}
fn main() {
let arr: Vec<i32> = vec![2, 3, 4, 7, 11];
let k: i32 = 5;
let result = find_kth_positive(arr, k);
println!("{}", result);
}

c语言完整代码如下:
#include <stdio.h>
int findKthPositive(int* arr, int arrSize, int k) {
int l = 0;
int r = arrSize - 1;
int m = 0;
int find = arrSize;
while (l <= r) {
m = (l + r) / 2;
if (arr[m] - (m + 1) >= k) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
}
int preValue = find == 0 ? 0 : arr[find - 1];
int under = preValue - find;
return preValue + (k - under);
}
int main() {
int arr[] = { 2, 3, 4, 7, 11 };
int k = 5;
int arrSize = sizeof(arr) / sizeof(arr[0]);
int result = findKthPositive(arr, arrSize, k);
printf("%d\n", result);
}

c++完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
int findKthPositive(vector<int>& arr, int k) {
int l = 0;
int r = arr.size() - 1;
int m = 0;
int find = arr.size();
while (l <= r) {
m = (l + r) / 2;
if (arr[m] - (m + 1) >= k) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
}
int preValue = find == 0 ? 0 : arr[find - 1];
int under = preValue - find;
return preValue + (k - under);
}
int main() {
vector<int> arr = { 2, 3, 4, 7, 11 };
int k = 5;
int result = findKthPositive(arr, k);
cout << result << endl;
}

2023-05-16:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 输入:arr = [2,3,4,7,11], k = 5。 输出:9的更多相关文章
- 在排序数组中查找元素的第一个和最后一个位置(给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。)
示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出 ...
- 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...
- C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
C#实现如何判断一个数组中是否有重复的元素 如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...
- 返回一个数组升序排列后的位置信息--C#程序举例
返回一个数组升序排列后的位置信息--C#程序举例 返回某一个数组升序排序后的位置 比如:{8,10,9,11}排序后应该是{8,9,10,11},但是需要返回{1,3,2,4} 大概记忆里是这么 ...
- 第11章 GPIO输出—使用固件库点亮LED
第11章 GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...
- 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
第11章 GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...
- 输入一个字符串,内有数字和非数字字符。例如:a123x456 17960 302tab5876。将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。
题目内容:输入一个字符串,内有数字和非数字字符.例如:a123x456 17960 302tab5876.将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1 ...
- 2023.1.16[模板]BSGS/exBSGS
2023.1.16 [模板]BSGS/exBSGS 全称Boy Step Girl Step 给定一个质数 p,以及一个整数 a,一个整数 b,现在要求你计算一个最小的非负整数 l, 满足\(a^x ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...
随机推荐
- Django笔记二之连接数据库、执行migrate数据结构更改操作
本篇笔记目录索引如下: Django 连接mysql,执行数据库表结构迁移步骤介绍 操作数据库,对数据进行简单操作 接下来几篇笔记都会介绍和数据库相关,包括数据库的连接.操作(包括增删改查).对应的字 ...
- Oracle 服务器概念梳理
Oracle 公司是世界上最大的信息管理软件及服务提供商,因其复杂的关系数据库产品而闻名.Oracle 的关系数据库是世界上第一个支持 SQL 语言的数据库.支持服务器/客户机等部署.Oracle 数 ...
- ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler 功能详解
SimpleChannelInboundHandler [类的关系]:如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAd ...
- keyclaok~keycloak存到cookie中的值和session_state
keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...
- ACM-NEFUOJ-汉诺塔问题
P200汉诺塔 #include<bits/stdc++.h> using namespace std; int main() { int n,i; long long s[40]; s[ ...
- 关于关键字final用法以及意义
* * 1.final可以用来修饰的结构:类.方法.变量 * * 2.final用来修饰一个类:此类不能被其他类所继承. * 比如:String类.System类.St ...
- flask-login使用方法
烧瓶登录 Flask-Login 为 Flask 提供用户会话管理.它处理登录.注销和长时间记住用户会话的常见任务. 它会: 将活动用户的 ID 存储在Flask Session中,让您轻松登录和注销 ...
- pnpm 之降本增效
作者:京东科技 于振京 受众简介 前端研发工程师 还在为npm i安装大量依赖等待时间较长,npm扁平化node_modules依赖版本冲突在苦恼吗,不用苦恼pnpm为你保驾护航 主要影响:安装依赖包 ...
- 【python基础】五大数据类型及常用方法
1. 数据类型概述 python中的字符串,列表,元组,字典,集合这五种数据类型均是可迭代的,可以使用for循环访问,涵盖了三类数据结构分别为序列.散列.集合. 序列: 字符串 str 列表 list ...
- 请求被中止: 未能创建 SSL/TLS 安全通道 解决方案
最近项目改造https,有部分请求出现"请求被中止: 未能创建 SSL/TLS 安全通道". 原因应该是,接口方变更了安全协议,而客户端并未启用该协议. 解决办法自然就是:让客户端 ...