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. upload-labs 第一关 前端验证绕过!

    打开靶场发现只能上传jpg png gif 的文件格式的文件,我们想要上传上去的文件格式为php文件格式,首先在Notepad++里面打开图片,会出现很多乱码,我们在最后面添加漏洞语句<?php ...

  2. STM32H5移植zbar记录

    ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用.在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要. ZBar适用于各种嵌入式 ...

  3. 每周更新 | Verilog测试用例及波形展示图功能上线

    Hi,亲爱的技术伙伴,经过产研团队的努力,本周ShowMeBug有以下4个功能上线啦- 芯片语言 Verilog 支持测试用例 芯片语言 Verilog 支持测试用例,自动评分同步上线- 同时,Ver ...

  4. Anaconda入门使用指南(二)

    Anaconda 安装完成,在 bin 子目录下( $PREFIX/bin )可以看到该发行版本预装好的 conda.python.pip.jupyter,以及一些常用的工具. Python环境管理 ...

  5. Python初学者友好丨详解参数传递类型

    摘要: 本文清晰地解释了Python中的不同参数传递类型,并提供了示例代码来说明每种类型的用法.对于初学者或不清楚Python传参的读者们来说是非常有益的,文中提供了足够的信息来理解和使用Python ...

  6. k8s kong部署

    docker部署postgres docker run -d \ --name kong-postgres \ -e POSTGRES_PASSWORD=kong \ -e PGDATA=/var/l ...

  7. 不成生DOM的非主流Blazor UI开源啦!

      作者之前介绍了开发中的PixUI,为了适配Web应用采用了将C#通过Roslyn语法语义分析后转换为Javascript的方案,但是这样带来的问题是工程量较大,在短时间内无法达到生产级质量.因此在 ...

  8. 如何让ChatGPT高效的理解你的Prompt

    1.概述 ChatGPT是由 OpenAI 开发的一种强大的语言模型,它在许多自然语言处理任务中展现出了惊人的能力.而其中一个关键的技术概念就是 "Prompt".本文将深入探讨 ...

  9. WakaTime Readme Stats-开源项目翻译

    寻找不同语言和地区的翻译 #23 Readme中添加了功能标志的开发指标 眼前一亮的Readme统计数据 你是早起的还是夜间的? 你一天中什么时候工作效率最高? 你用什么语言编写代码? 让我们在你的个 ...

  10. 行行AI人才沙龙第1期:《AI大模型创业投资,哪里才是真风口?》

    行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台. 要说近期科技圈和投资圈"最靓的崽",那自然非"AI大模型"莫属.自ChatGPT发布以 ...