Leetcode---353周赛

news2024/11/26 4:34:22

周赛题目

2769. 找出最大的可达成数字

2770. 达到末尾下标所需的最大跳跃次数

2771. 构造最长非递减子数组

2772. 使数组中的所有元素都等于零

一、找出最大的可达成数字

这题就是简单的不能在简单的简单题, 题目意思是:给你一个数num和操作数t,需要你在对num和x进行t次操作之后,使得x<=num,问这个初始x的最大值是多少?那很显然num不断+1,x不断-1,最后x==num这种情况下,x的初始值最大,代码如下

int theMaximumAchievableX(int num, int t){
    return num+2*t;
}

二、达到末尾下标所需的最大跳跃次数

遇到这种从数组头跳到尾的跳跃问题,一般都是用动态规划,但是我们先不用动态规划,我们先用递归来想一想

1.确定递归参数及其返回值:根据题目,它要求从0到n的最大跳跃次数,我们就定义dfs(i)返回从0到i的最大跳跃次数(i表示下标)

2.确定递归的表达式:dfs(i)=max{dfs(k,i)+1}  (k<i),条件是abs(nums[i]-nums[k])<=target) 

3.确定递归的边界边界和递归入口:

递归边界:i==0时,返回0,即理解为在一开始的跳跃次数是0,或者从0到0不需要跳跃

递归入口:dfs(n-1)

代码如下

//这个是一般的递归写法,会超时
int T;
int*Nums;
int dfs(int i){
    if(i==0)
        return 0;
    int res=INT_MIN;//这里给整形的最小值表示一种不可能的可能性,且不防止后面取较大值
    for(int k=0;k<i;k++){
        if(abs(Nums[k]-Nums[i])<=T){
            res=fmax(res,dfs(k)+1);
        }
    }
    return res;
}
int maximumJumps(int* nums, int numsSize, int target){
    Nums=nums;
    T=target;
    int ans=dfs(numsSize-1);
    return ans<0?-1:ans;
}

//记忆化搜索
int T;
int*Nums;
int*memo;
int dfs(int i){
    if(i==0)
        return 0;
    if(memo[i]!=INT_MAX)
        return memo[i];
    int res=INT_MIN;
    for(int k=0;k<i;k++){
        if(abs(Nums[k]-Nums[i])<=T){
            res=fmax(res,dfs(k)+1);
        }
    }
    return memo[i]=res;
}
int maximumJumps(int* nums, int numsSize, int target){
    Nums=nums;
    T=target;
    memo=(int*)malloc(sizeof(int)*numsSize);
    for(int i=0;i<numsSize;i++)
        memo[i]=INT_MAX;
    int ans=dfs(numsSize-1);
    free(memo);
    return ans<0?-1:ans;
}

//1:1翻译成递推
//f[i]代表到i位置所需要的最大的跳跃次数
int maximumJumps(int* nums, int numsSize, int target){
    int f[numsSize];
    f[0]=0;
    for(int i=1;i<numsSize;i++){
        int res=INT_MIN/2;
        for(int j=0;j<i;j++){
            if(abs(nums[i]-nums[j])<=target){
                res=fmax(res,f[j]+1);
            }  
        }
        f[i]=res;
    }
    return f[numsSize-1]<0?-1:f[numsSize-1];
}

那么如果我们一开始就知道用动态规划,我们应该怎么思考这道题?其实思考的过程和上面的递归神似,我们只要思考下面的三个问题:1.动规的数组的含义是什么?2.动规的递推表达式是什么?3.动规数组的初始化是什么?

参开上面代码我们不难回答上面三个问题:

1.f[i] 代表从0到i所需的最大跳跃次数

2.f[i] = max{ f[k] + 1 }   ( k < i )  条件为abs( f[i] - f[k] ) <= target

3.f[0] = 0 

代码就是上面的由递归翻译出的递推

大家可以自己去感悟感悟两种思考过程的联系和区别,对以后的做题还是很有帮助的

三、构造最长非递减子数组

 其实这题和上面一题一样用递归来解决,我们还是需要(从后往前推)

1.确定递归的参数和返回值:我们需要确定第i个数字取nums1[i]还是nums2[i],所以我们需要两个参数,dfs(i,0/1),i代表当前位下标,0/1代表第i个数选的是哪个数组中的数,返回值代表子数组的最大长度

2.确定递归的表达式:dfs(i,0/1)=max{dfs(i-1,0/1)+1} 前提:符合条件

3.递归的边界和入口:边界条件:i==0,返回1 

代码如下

int **nums;
int*Nums1;
int*Nums2;
int**memo;
int dfs(int i,int j){
    if(i==0)
        return 1;
    if(memo[i][j]!=-1)
        return memo[i][j];
    int res=1;
    if(Nums1[i-1]<=nums[j][i])
        res=fmax(res,dfs(i-1,0)+1);
    if(Nums2[i-1]<=nums[j][i])
        res=fmax(res,dfs(i-1,1)+1);
    return memo[i][j]=res;
}
int maxNonDecreasingLength(int* nums1, int nums1Size, int* nums2, int nums2Size){
    nums=(int**)malloc(sizeof(int*)*2);
    nums[0]=nums1,nums[1]=nums2;
    Nums1=nums1,Nums2=nums2;
    memo=(int**)malloc(sizeof(int*)*nums1Size);
    for(int i=0;i<nums1Size;i++){
        memo[i]=(int*)malloc(sizeof(int)*2);
        memo[i][0]=memo[i][1]=-1;
    }
    int ans=1;
    for(int i=0;i<nums1Size;i++){
        ans=fmax(fmax(dfs(i,0),dfs(i,1)),ans);
    }
    for(int i=0;i<nums1Size;i++)
        free(memo[i);
    free(memo);
    return ans;
}

//1:1翻译成递推
int maxNonDecreasingLength(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int**nums=(int**)malloc(sizeof(int*)*2);
    nums[0]=nums1,nums[1]=nums2;
    int f[nums1Size][2];
    f[0][0]=f[0][1]=1;
    int ans=1;
    for(int i=1;i<nums1Size;i++){
        for(int j=0;j<2;j++){
            int res=1;
            if(nums1[i-1]<=nums[j][i])
                res=fmax(res,f[i-1][0]+1);
            if(nums2[i-1]<=nums[j][i])
                res=fmax(res,f[i-1][1]+1);
            f[i][j]=res;
            ans=fmax(ans,f[i][j]);
        }
    }
    return ans;
}

//优化空间复杂度
int maxNonDecreasingLength(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int**nums=(int**)malloc(sizeof(int*)*2);
    nums[0]=nums1,nums[1]=nums2;
    int f[2][2];
    f[0][0]=f[0][1]=1;
    int ans=1;
    for(int i=1;i<nums1Size;i++){
        for(int j=0;j<2;j++){
            int res=1;
            if(nums1[i-1]<=nums[j][i])
                res=fmax(res,f[(i-1)%2][0]+1);
            if(nums2[i-1]<=nums[j][i])
                res=fmax(res,f[(i-1)%2][1]+1);
            f[i%2][j]=res;
            ans=fmax(ans,f[i%2][j]);
        }
    }
    return ans;
}

 四、使数组中的所有元素都等于零

这题看到对一段区间进行加减的操作就要想到差分数组,那么差分数组是啥?下面举个例子来带领大家了解一下 

 了解了差分数组之后,这题其实就迎刃而解了,补充一点当差分数组全为0时,原数组就是全0

代码如下

bool checkArray(int* nums, int numsSize, int k){
    int f[numsSize+1];//防止x下面的i+k越界
    memset(f,0,sizeof(f));
    f[0]=nums[0];
    for(int i=1;i<numsSize;i++)
        f[i]=nums[i]-nums[i-1];
    f[numsSize]=-nums[numsSize-1];//最后一个数之后的值不存在我们就当在数组后面加了一个元素0
    for(int i=0;i+k<=numsSize;i++){
        if(f[i]>0){
            f[i+k]+=f[i];
            f[i]=0;
        }
    }
    for(int i=0;i<=numsSize;i++){
        if(f[i]!=0)
            return false;
    }
    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能分析网关V2有抓拍告警但无法推送到EasyCVR,是什么原因?

我们在此前的文章中也介绍了关于智能分析网关V2接入EasyCVR平台的操作步骤&#xff0c;感兴趣的用户可以查看这篇文章&#xff1a;在EasyCVR新版本v3.3中&#xff0c;如何正确接入智能分析网关V2&#xff1f; 智能分析网关V2是基于边缘AI计算技术&#xff0c;可对前端摄像头采…

机器学习 day27(反向传播)

导数 函数在某点的导数为该点处的斜率&#xff0c;用height / width表示&#xff0c;可以看作当w增加ε&#xff0c;J(w,b)增加k倍的ε&#xff0c;则k为该点的导数 反向传播 tensorflow使用反向传播来自动计算神经网络模型中的导数

中国区域地面气象要素驱动数据集(1979-2018)

中国区域地面气象要素驱动数据集&#xff08;1979-2018&#xff09; 摘要 中国区域地面气象要素驱动数据集&#xff0c;包括近地面气温、近地面气压、近地面空气比湿、近地面全风速、地面向下短波辐射、地面向下长波辐射、地面降水率共7个要素。数据为NETCDF格式&#xff0c;时…

Redis_非关系型数据库

一、 Redis介绍 1.NoSQL 也叫Not Only SQL(不仅仅是SQL, 不用 sql语言操作的数据库), 一般指非关系型数据库 关系型数据库: 以数据库表为单位存储,表与表之间存在某种关系 非关系型数据库: 数据与数据之间没有关系, 数据就是以键值对的形式存储, 通过键获取到值 在互联网发展中…

cjson的内存泄漏案例

1、当我们使用下面这些创建json对象时&#xff0c;需要用cJSON_Delete();释放&#xff0c;&#xff08;当然&#xff0c;释放父JSON对象后&#xff0c;子JSON对象也会被释放&#xff09; 2、多次释放同一内存空间 在recv_write_property函数中的data&#xff0c;在Equipment_re…

Unity游戏源码分享-Unity5.4.1打砖块游戏Breakout_Game_Starter_Kit

Unity5.4.1打砖块游戏Breakout_Game_Starter_Kit 童年的回忆 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88042779Unity游戏源码分享-

ViDeNN: Deep Blind Video Denoising

ViDeNN: Deep Blind Video Denoising 摘要 We propose ViDeNN: a CNN for Video Denoising without prior knowledge on the noise distribution (blind denoising). The CNN architecture uses a combination of spatial and temporal filtering, learning to spatially deno…

【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从跨平台到跨行业 开发工具&#xff1a;IntelliJ IDEA Java 泛型方法 泛型方法 ❓需求| 泛型的通配符 | 上限 | 下限 |泛型擦除 ⛔基本数据类型问题 泛型方法 ❓ [修饰符] <类型变量, 类型变量...> [返回…

内容过多,超出部分以省略号“...”显示

效果图如图所示&#xff1a; 1.第一种实现方法&#xff0c;使用纯css实现&#xff08;ps&#xff1a;此方式必须给元素设置宽度&#xff0c;否则可能无效果&#xff09;&#xff0c;代码如下&#xff1a; html代码 <!-- 超过长度&#xff0c;用省略号实现&#xff0c;css的…

相交链表——力扣160

题目描述 法一&#xff09;哈希表 class Solution{ public:ListNode* getIntersectionNode (ListNode* headA, ListNode* headB){unordered_set<ListNode*> st;ListNode* temp headA;while(temp){st.insert(temp);temp temp->next;}temp headB;while(temp){if(st.c…

DES加密解密 Feistel算法网络结构 详讲

文章目录 简单知识导入&#xff1a;具体过程&#xff1a;IP置换&#xff08; 64 − > 64 64->64 64−>64&#xff09;轮函数--E扩展置换&#xff08; 32 − > 48 32->48 32−>48&#xff09;轮函数--与子密钥异或&#xff08; 48 − > 48 48->48 48−&…

【Matlab】智能优化算法_人工大猩猩部队优化算法GTO

【Matlab】智能优化算法_人工大猩猩部队优化算法GTO 1.背景介绍2.数学模型2.1 勘探阶段2.2 开采阶段2.2.1 跟随银背2.2.2 成年女性比赛 3.文件结构4.算法流程图5.伪代码6.详细代码及注释6.1 boundaryCheck.m6.2 GTO.m6.3 initialization.m6.4 main.m6.5 ObjectiveFunction.m 7.…

LabVIEW开发惯性测量系统

LabVIEW开发惯性测量系统 惯性导航系统是通过将惯性传感器直接绑定在载体主体上来完成制导和导航任务的系统。所以惯性测量系统主要是动态静态地测试陀螺仪和加速度计的性能。测试点和计算点数众多&#xff0c;对测试速度和精度要求高。基于上述特点&#xff0c;基于虚拟仪器软…

Web自动化 —— Selenium元素定位与防踩坑

1. 基本元素定位一 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # selenium Service("../../chromedriver.exe") # driver webdriver.Chrome(serviceService) # driver.…

[oeasy]python0072_整数类型_int_integer_整型变量

帮助手册 回忆上次内容 上次了解的是 字符串字符串 就是 字符的串 字符串长度 可以用 len函数字符可以用下标索引 [] 可以用str 将整型数字 转化为 字符串 字符的长度本身 有长有短 ascii字符集 包括各种 转义字符 都对应 1 个字节 unicode 字符中的汉字 可能对应 3 个字节 但…

开放式耳机推荐,开放式耳机排行榜前十推荐

传统入耳式耳机长时间佩戴会给耳朵增加压力&#xff0c;在封闭状态下&#xff0c;还容易滋生细菌&#xff0c;引发耳部感染、发炎的症状&#xff0c;而开放式耳机则没有这种现象&#xff0c;开放式耳机不入耳设计&#xff0c;佩戴上耳更加稳固舒适&#xff0c;长时间使用没有压…

SOPC之NiosⅡ系统(三)

常用NIOS Ⅱ组件概括 目录 1.定时器Timer 1.1 预定义硬件配置 1.2 超时周期Timeout poriod 1.3 计数器大小Timer counter Size 1.4 寄存器Registers 2.串口UART 2.1 基础设置Basic settings 2.1.1 奇偶校验Parity 2.1.2 数据为Data bits 2.1.3 停止位Stop bits 2.1…

[论文分享]TS-TCC:基于时间和语境对比的时间序列表征学习

论文题目&#xff1a;Time-Series Representation Learning via Temporal and Contextual Contrasting 论文地址&#xff1a;https://www.ijcai.org/proceedings/2021/0324.pdf 代码地址&#xff1a;GitHub - emadeldeen24/TS-TCC: [IJCAI-21] "Time-Series Representatio…

流量经常超标,原因竟然出在“定向流量”身上!盘它!

现在网上办理的大流量手机卡套餐&#xff0c;一般都是包含通用流量和定向流量的。通用流量小编在这里就不过多解释&#xff0c; 但是定向流量如何使用&#xff0c;怎么消耗的&#xff0c;好多小伙伴们都还不太清楚。在这里&#xff0c;小编就着重讲一下&#xff0c;喜欢的记得…

08_SPI-Flash 扇区擦除实验

08_SPI-Flash 扇区擦除实验 1. 实验目标2. 操作时序2.1 扇区擦除操作指令2.2 完整扇区擦除操作时序 3. 程序框图3.1 顶层框图3.2 扇区擦除模块 4. 波形图5. RTL5.1 flash_se_ctrl5.2 spi_flash_se 6. Testbench6.1 tb_flash_se_ctrl6.2 tb_spi_flash_se 1. 实验目标 编写扇区擦…