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-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了

    2021-09-26:搜索旋转排序数组.整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.lengt ...

  2. hasattr()、getattr()、setattr()函数简介

    hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是name ...

  3. 反向传播(Backpropagation)相关思想

    在前面我们学习了SVM损失函数和softmax损失函数,我们优化权重矩阵w的具体思路便是让损失函数最小化,还记得损失函数的定义吗? 没错,损失函数长这样,其中,Wj为权重矩阵的第j个列向量,xi为第i ...

  4. Spring Boot 自动配置一篇概览

    一.什么是自动配置 bean 自动配置类通过添加 @AutoConfiguration 注解实现. 因为 @AutoConfiguration 注解本身是以 @Configuration 注解的,所以 ...

  5. Java(break、continue、label)

    1.break break在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) 例如:循环输出10 ...

  6. Anaconda 环境下 R 包 ggraph_1.0.2 安装小记

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 记录一下今天在 Anaconda3 环境下 R==3.4.3 中安装 ggraph 的一些问题 ...

  7. 【城南】如何识别AI生成图?视觉AIGC伪造检测技术综述

    如何识别 AI 生成图片?or 如何识别 AIGC 图?or 如何识别 AI 换脸?or AI生成图伪造检测? 类似的说法有很多种,总之就是利用AI技术来鉴别一张图是不是AI生成的,这种AI技术就是本 ...

  8. ProtocolBuffers的国际化和本地化支持

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 34.< Protocol Buffers 的国际化和本地化支持> 本文将介绍 ...

  9. PHP curl提交参数到某个网址,然后获取数据

    <?php $data = '你的每个参数'; $url = 'https://www.bz80.vip/'; //举例 $html = post_data($url,$data); echo ...

  10. Net 编译器平台--- Roslyn Scripting APIs

    引言 上一篇中.Net 编译器平台 --- Roslyn,介绍了Roslyn的各项功能,包括公开API,使用语法,使用语义,使用工作区等功能. 那么回到上一篇中提到的问题,实现类似这样的功能(以下代码 ...