2023-08-24:请用go语言编写。给定一个长度为n的数组arr,

现在你有一次机会, 将其中连续的K个数全修改成任意一个值,

请你计算如何修改可以使修改后的数 列的最长不下降子序列最长。

请输出这个最长的长度。

最长不下降子序列:子序列中的每个数不小于在它之前的数。

1 <= k, n <= 10^5,

1 <= arr[i] <= 10^6。

来自左程云

答案2023-08-24:

以下是大致的步骤描述:

1.定义常量MAXN为100001,声明全局数组和变量:arr、right、ends、n和k。这些数组和变量将用于存储计算过程中的中间结果和输入数据。

2.在main函数中设置给定的输入数据:n表示数组的长度为5,k表示连续的k个数需要修改,arr存储具体的数组元素。

3.判断如果k大于等于n,则无需做修改,直接输出n作为最长不下降子序列的长度。

4.否则,调用rightFn函数计算修改后的数组中以每个元素为结尾的最长不下降子序列的长度,并将结果存储在数组right和ends中。

5.调用getAns函数计算修改后的数组的最长不下降子序列的长度,并输出结果。

rightFn函数的步骤描述:

1.初始化right数组的最后一个元素right[n]为1,表示以最后一个元素为结尾的最长不下降子序列的长度为1。

2.初始化ends数组的第一个元素ends[1]为arr[n],表示以最后一个元素为结尾的最长不下降子序列的最后一个元素为arr[n]。

3.初始化len为1,表示当前得到的最长不下降子序列的长度为1。

4.从倒数第二个元素开始,循环遍历数组arr,通过二分查找的方式找到以arr[i]为结尾的最长不下降子序列的长度。

5.使用二分查找的辅助数组ends,找到大于arr[i]的第一个元素位置find。

6.将arr[i]赋值给ends[find],更新当前的最长不下降子序列的长度为max(len, find),并将结果存储在right[i]中。

7.循环结束后,right数组存储了以每个元素为结尾的最长不下降子序列的长度。

getAns函数的步骤描述:

1.初始化ans为0,表示当前的最长不下降子序列的长度为0。

2.初始化len为0,表示当前最长不下降子序列的长度为0。

3.从第k+1个元素开始,循环遍历数组arr,计算修改后的数组的最长不下降子序列的长度。

4.使用二分查找的方式找到arr[i]在ends数组中的位置find。

5.更新ans为max(ans, find+right[i]-1+k)。其中,find表示以arr[i]为结尾的最长不下降子序列的长度,right[i]表示以arr[i]为起点的最长不下降子序列的长度,k表示连续的k个数被修改。

6.使用二分查找的辅助数组ends,找到大于arr[j]的第一个元素位置find(这里j为i-k)。

7.将arr[j]赋值给ends[find],更新当前的最长不下降子序列的长度为max(len, find)。

8.循环结束后,ans存储了修改后的数组的最长不下降子序列的长度。

9.返回ans作为结果。

总的时间复杂度为O(n log n),其中n为数组的长度,主要是由二分查找的过程引起的。

总的额外空间复杂度为O(n),主要是由数组的存储引起的。

go完整代码如下:

package main

import (
"fmt"
) const MAXN = 100001 var arr [MAXN]int
var right [MAXN]int
var ends [MAXN]int
var n, k int func main() { n = 5
k = 1
arr[1] = 1
arr[2] = 4
arr[3] = 2
arr[4] = 8
arr[5] = 5 if k >= n {
fmt.Println(n)
} else {
rightFn()
fmt.Println(getAns())
}
} func rightFn() {
right[n] = 1
ends[1] = arr[n]
len := 1 for i := n - 1; i > 0; i-- {
l := 1
r := len
find := len + 1 for l <= r {
m := (l + r) / 2
if ends[m] < arr[i] {
find = m
r = m - 1
} else {
l = m + 1
}
} ends[find] = arr[i]
len = max(len, find)
right[i] = find
}
} func getAns() int {
ans := 0
len := 0 for i, j := k+1, 1; i <= n; i, j = i+1, j+1 {
l := 1
r := len
find := len + 1 for l <= r {
m := (l + r) / 2
if ends[m] > arr[i] {
find = m
r = m - 1
} else {
l = m + 1
}
} ans = max(ans, find+right[i]-1+k) l = 1
r = len
find = len + 1 for l <= r {
m := (l + r) / 2
if ends[m] > arr[j] {
find = m
r = m - 1
} else {
l = m + 1
}
} len = max(len, find)
ends[find] = arr[j]
} ans = max(ans, len+k)
return ans
} func max(a, b int) int {
if a > b {
return a
}
return b
}

rust完整代码如下:

const MAXN: i32 = 100001;

static mut ARR: [i32; MAXN as usize] = [0; MAXN as usize];
static mut RIGHT: [i32; MAXN as usize] = [0; MAXN as usize];
static mut ENDS: [i32; MAXN as usize] = [0; MAXN as usize];
static mut N: i32 = 0;
static mut K: i32 = 0; fn main() {
unsafe {
N = 5;
K = 1;
ARR[1] = 1;
ARR[2] = 4;
ARR[3] = 2;
ARR[4] = 8;
ARR[5] = 5; if K >= N {
println!("{}", N);
} else {
right_fn();
println!("{}", get_ans());
}
}
} fn right_fn() {
unsafe {
RIGHT[N as usize] = 1;
ENDS[1] = ARR[N as usize];
let mut len: i32 = 1; let mut i = N - 1;
while i >= 0 {
let mut l = 1;
let mut r = len;
let mut find = len + 1; while l <= r {
let m = (l + r) / 2;
if ENDS[m as usize] < ARR[i as usize] {
find = m;
r = m - 1;
} else {
l = m + 1;
}
} ENDS[find as usize] = ARR[i as usize];
len = max(len, find);
RIGHT[i as usize] = find;
i -= 1;
}
}
} fn get_ans() -> i32 {
let mut ans = 0;
let mut len = 0; unsafe {
let mut i = K + 1;
let mut j: i32 = 1;
while i <= N {
let mut l: i32 = 1;
let mut r = len;
let mut find = len + 1; while l <= r {
let m = (l + r) / 2;
if ENDS[m as usize] > ARR[i as usize] {
find = m;
r = m - 1;
} else {
l = m + 1;
}
} ans = max(ans, find + RIGHT[i as usize] - 1 + K); l = 1;
r = len;
find = len + 1; while l <= r {
let m = (l + r) / 2;
if ENDS[m as usize] > ARR[j as usize] {
find = m;
r = m - 1;
} else {
l = m + 1;
}
} len = max(len, find);
ENDS[find as usize] = ARR[j as usize];
i += 1;
j += 1;
} ans = max(ans, len + K);
} ans
} fn max(a: i32, b: i32) -> i32 {
if a > b {
a
} else {
b
}
}

c++完整代码如下:

#include <iostream>
#include <algorithm>
using namespace std; const int MAXN = 100001; int arr[MAXN] = { 0 };
int right0[MAXN] = { 0 };
int ends0[MAXN] = { 0 };
int n, k; int max(int a, int b) {
if (a > b) {
return a;
}
return b;
} void rightFn() {
right0[n] = 1;
ends0[1] = arr[n];
int len = 1; for (int i = n - 1; i > 0; i--) {
int l = 1;
int r = len;
int find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends0[m] < arr[i]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} ends0[find] = arr[i];
len = max(len, find);
right0[i] = find;
}
} int getAns() {
int ans = 0;
int len = 0; for (int i = k + 1, j = 1; i <= n; i++, j++) {
int l = 1;
int r = len;
int find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends0[m] > arr[i]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} ans = max(ans, find + right0[i] - 1 + k); l = 1;
r = len;
find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends0[m] > arr[j]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} len = max(len, find);
ends0[find] = arr[j];
} ans = max(ans, len + k);
return ans;
} int main() {
n = 5;
k = 1;
arr[1] = 1;
arr[2] = 4;
arr[3] = 2;
arr[4] = 8;
arr[5] = 5; if (k >= n) {
cout << n << endl;
}
else {
rightFn();
cout << getAns() << endl;
} return 0;
}

c完整代码如下:

#include <stdio.h>

#define MAXN 100001

int arr[MAXN];
int right[MAXN];
int ends[MAXN];
int n, k; int max(int a, int b) {
return (a > b) ? a : b;
} void rightFn() {
right[n] = 1;
ends[1] = arr[n];
int len = 1; for (int i = n - 1; i > 0; i--) {
int l = 1;
int r = len;
int find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends[m] < arr[i]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} ends[find] = arr[i];
len = max(len, find);
right[i] = find;
}
} int getAns() {
int ans = 0;
int len = 0; for (int i = k + 1, j = 1; i <= n; i++, j++) {
int l = 1;
int r = len;
int find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends[m] > arr[i]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} ans = max(ans, find + right[i] - 1 + k); l = 1;
r = len;
find = len + 1; while (l <= r) {
int m = (l + r) / 2;
if (ends[m] > arr[j]) {
find = m;
r = m - 1;
}
else {
l = m + 1;
}
} len = max(len, find);
ends[find] = arr[j];
} ans = max(ans, len + k);
return ans;
} int main() {
n = 5;
k = 1;
arr[0] = 0;
arr[1] = 1;
arr[2] = 4;
arr[3] = 2;
arr[4] = 8;
arr[5] = 5; if (k >= n) {
printf("%d\n", n);
}
else {
rightFn();
printf("%d\n", getAns());
}
return 0;
}

2023-08-24:请用go语言编写。给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续的K个数全修改成任意一个值, 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长。 请输出的更多相关文章

  1. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

  2. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

  3. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  4. 网络流24题 P2766 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  5. 不用循环,、es6创建一个长度为100的数组

    问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标? 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1 ...

  6. P2766 [网络流24题]最长不下降子序列问题

    ha~ «问题描述: 给定正整数序列$x_1,...,x_n$ .$n<=500$ 求(1)计算其最长不下降子序列的长度$s$. (2)计算从给定的序列中最多可取出多少个长度为$s$的不下降子序 ...

  7. 用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。

    用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据. 比如:[1, 2, 3, 3, 2, 2, 6, 7, 8, 9] 中 2 or 3 分析:这道题目,实现比 ...

  8. 一个简单的算法,定义一个长度为n的数组,随机顺序存储1至n的的全部正整数,不重复。

    前些天看到.net笔试习题集上的一道小题,要求将1至100内的正整数随机填充到一个长度为100的数组,求一个简单的算法. 今天有空写了一下.代码如下,注释比较详细: using System; usi ...

  9. 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合

    给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...

  10. 【24题】P2766最长不下降子序列问题

    网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...

随机推荐

  1. 2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*

    2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓. n<=100000(10^5) ...

  2. Vue根据时间戳制作倒计时15分钟

    废话不多说直接上代码 <script> export default { data() { return { downTimeShow: true, timer: null, downTi ...

  3. 一个线上全文索引BUG的排查:关于类阿拉件数字的分词与检索

    说到全文检索的分词,多半讲到的是中(日韩)文分词,少有英文等拉丁文系语言,因为英语单词天然就是分词的. 但更少讲到阿拉伯数字.比如金额,手机号码,座机号码等等. 以下不是传统的从0开始针对mysql全 ...

  4. flex弹性布局模式下文字超出显示省略号

    都知道flex弹性布局非常好用,会随分辨率不同,宽高自适,那怎么来设置在一定范围内的文字超出隐藏,显示省略号呢?其实也不难 看如下就是使用flex布局的 其实如上效果也同样离不开如下三句,只是用法不大 ...

  5. web自动化04-css定位

    css元素定位 1. 是什么? 用来描述html元素的显示样式 选择器是一种模式,用于选择需要添加样式的元素   selenium中推荐使用css定位,比XPath定位要快    2.如何定位?   ...

  6. 为teamcity的代码语法检查工具pyflakes增加支持python2和python3

    TeamCity和pyflakes TeamCity是一款由JetBrains公司开发的持续集成和部署工具,它提供了丰富的功能来帮助团队协作进行软件开发.其中包括代码检查.自动化构建.测试运行.版本控 ...

  7. R 语言 download.file 的几点知识

    R 语言中,不管是安装包,还是下载数据,很多时候都会用到download.file这个函数.如果你在安装包或者下载数据过程中出现中断,或者异常,想要判断是远程源服务器的问题,还是自身服务器的问题,还是 ...

  8. 【Netty】Netty部分源码分析(启动流程,EventLoop,accept流程,read流程)

    源码分析 Netty源码中调用链特别长,且涉及到线程切换等步骤,令人头大:) 1 启动剖析 我们就来看看 netty 中对下面的代码是怎样进行处理的 //1 netty 中使用 NioEventLoo ...

  9. 韩顺平Spring体系化笔记(内含ioc,aop,动态代理等底层原理)

    Spring Spring 核心学习内容 IOC.AOP. JdbcTemplate.声明式事务 1.Spring 几个重要概念 Spring 可以整合其他的框架(Spring 是管理框架的框架) S ...

  10. 前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度

    前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度, 下载完整代码请访问https://ext.dcloud.net.cn/plugin?id=13003 效果图如下:   ...