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. Django 与 Vue 语法冲突问题完美解决方法

    Django 与 Vue 语法冲突问题完美解决方法 当我们在 django web 框架中,使用 vue 的时候,会遇到语法冲突. 因为 vue 使用 {{}}, 而 django 也使用 {{}}, ...

  2. 500代码行代码手写docker-设置网络命名空间

    (4)500代码行代码手写docker-设置网络命名空间 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似do ...

  3. Oracle Linux切换uek内核到rhck内核解决ACFS兼容问题

    背景:协助客户做验证,客户使用的是RHEL7.6环境,我这边是OEL7.6环境,开始以为区别不大,结果acfs兼容还是遇到问题,特此记录下. 现象:asmca图形没有acfs相关内容,无法使用acfs ...

  4. SpringBoot开发简单接口流程

    SpringBoot开发接口 初始化 新建项目 (1)使用 IDEA 的过程,新建Project,左侧选 Spring Initializr,点Next (2)选 8 版本,点Next (3)左侧选择 ...

  5. STL-array(ACM)

    1.C++ 11 出现的, C++98没有 2.可以作为数组元素 pair<array<int, 3>, int>pair<int a[3], int > 不能这样 ...

  6. (翻译)Rust中的设计模式(1-Use borrowed types for arguments)

    引言 设计模式 在开发程序中,我们必须解决许多问题.一个程序可以看作是一个问题的解决方案.它也可以被看作是许多不同问题的解决方案的集合.所有这些解决方案共同解决一个更大的问题. 在Rust中的设计模式 ...

  7. Django自身提供测试类、工具-调研

    Django自身提供测试类.工具 django.test.Client 他的作用是模拟客户端.提供一系列的方法,例如get.post.delete.login等其中login是用django自身的验证 ...

  8. php处理emoji表情 存数据库

    PHP 处理emoji表情 存数据库 直接过滤掉 1 function filter_emoji($str) { 2 $regex = '/(\\\u[ed][0-9a-f]{3})/i'; 3 $s ...

  9. 搭建Vue脚手架(vue-cli)

    windows下环境安装前置环境 node.js安装 https://nodejs.org/en/download/ 安装成功后打开cmd 输入如下,如果能看到node和npm的版本号了,说明已经安装 ...

  10. freeswitch的mod_cdr_csv模块

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯. fs中基本的话单模块mod_cdr_csv,可以满 ...