今日题目分享(两个维度的思考,双指针/动态规划,b站视频讲解)

news2024/11/17 10:46:28

先直接上连接

941有效的山脉数组

845数组中的最长山脉

2100适合打劫银行的日子.

2420找到所有好下标.

什么是两个维度?

这里是从代码随想录里面学习到的思考方式,开门见山地说,就是两个方面去考虑题目,比如,要求第i位的元素,左边元素都得非递增,右边元素都得非递减,那同时考虑这两个维度来做题的话会难一些,这个时候可以先考虑一个维度,再去考虑另外一个维度来做题,即我们先考虑有i左边有多少个非递增的,遍历完一次之后再回来看i右边有多少个非递减的

今天的题目主要以动态规划为主,这里就不多废话了,直接对题目进行分析吧


941有效的山脉数组

这道题是用作举例一下什么叫两个维度,其实不需要用到dp,双指针即可

,先考虑一个维度,左边元素比当前元素小,即左山腰,找到山峰,然后再去找右山腰

附上代码

    public static boolean validMountainArray(int[] arr) {
    	//山脉数组,从两边找即可
        // 双指针
        int left = 0;
        int right = arr.length - 1;
        // 注意防止指针越界
        while (left + 1 < arr.length && arr[left] < arr[left + 1]) {
            left++;
        }
        // 注意防止指针越界
        while (right > 0 && arr[right] < arr[right - 1]) {
            right--;
        }
        // 如果left或者right都在起始位置,说明不是山峰
        if (left == right && left != 0 && right != arr.length - 1) {
            return true;
        }
        return false;
    }

 845数组中的最长山脉

这道题就是两个维度的动态规划,当然双指针也能做

运用到的就是上面所说的两个维度的思考,可以发现,对某一个山脉的时候,我们如果上来就直接把两个维度都思考进去,是比较难做题的,这个时候不妨先考虑其一,我们先找以当前位作为山峰,先去找左山腰,遍历完之后得到一个只求当前位左边是非递减的dp,再另起一个记录右山脉的dp数组,最后将两个都合并起来去得到本题的解法。

    //动态规划做法
	//能否成为山脉数组的条件:长度至少为3,即有必须有两个山腰(往两边递减)
	//子数组默认连续,子序列不一定
	//可以思考出本题其实有两个维度,一个是找到递增一个是找到递减
	//共同点是,以某个点作为顶点往两边扩散
	//因此建立两个dp数组,从左到右和从右到左
    //对原数组进行分析有三种情况:从头到尾递增,从头到尾递减,有增有减
    //有增有减的情况就决定了某个点一定能作为山顶点
    //因此我们最后求结果的时候只需要比对以i作为山顶的时候,left[i]和right[i]的值即可
	public int longestMountain1(int[] arr) {
    	int len = arr.length;
    	if(len<=2) return 0;
    	//dp[i]:以i作为山顶,左向顶/右向顶递增的最长子数组为dp[i]
    	int left[] = new int[len];
    	int right[] = new int[len];
    	//初始化---每个点都可以作为山顶
    	Arrays.fill(left, 1);
    	Arrays.fill(right, 1);
    	//遍历顺序
    	//左向顶的最长
    	//最左边的一定无法成为山脉数组,因为没有左山腰
    	for(int i = 1;i<len-1;i++) {
    		if(arr[i]>arr[i-1]) {
    			left[i] = left[i-1]+1;
    		}
    	}
    	//最右边的一定无法成为山脉数组,因为没有右山腰
    	for(int i = len-2;i>=0;i--) {
    		if(arr[i]>arr[i+1]) {
    			right[i] = right[i+1]+1;
    		}
    	}
    	//长度至少为3才能算山脉数组,因此需要都大于1
    	int res = 0;
    	//枚举每个点(除了最左和最右)作为山顶来求最长山脉数组
    	for(int i = 1;i<len-1;i++) {
    		if(left[i]>1&&right[i]>1) {
    			//重复计算山顶,因此-1
    			res = Math.max(res, left[i]+right[i]-1);
    		}
    	}
    	return res;
    }

当然也附上双指针做法

	//非动态规划做法:找到某一个极大值,然后找的过程中左边一定是递增的,那么去检索右边
    public int longestMountain(int[] arr) {
        int n=arr.length,ans=0;
        for(int i=1;i<n-1;i++){
            if(arr[i]>arr[i-1]&arr[i]>arr[i+1]){
                int l=i-1,r=i+1;
                while(l>=0&&arr[l]<arr[l+1]){l--;}
                while(r<n&&arr[r]<arr[r-1]){r++;}
                ans=Math.max(ans,r-l-1);
            }
        }
        return ans;
    }

 2420找到所有好下标.

 2100适合打劫银行的日子.

这两道题就放一起了,因为基本上是一样的,不同之处在于2100包含本位的,2420不包含本位

什么意思呢?

首先看一下2100的题目

看一下2100执行结果


再来看一下2420的题目

2420的执行结果

 

 可以发现,两者题目描述上唯一的差别就是,2420是讨论i的前后,即不包含本位

2100虽然也是讨论i的前后,但是很明显可以看出这个前后其实是包含i的,对比一下两个预期结果就可以看得出来,2420中可以构成[1,2,3],只有不包含本位的时候才成立,单个数字既是非递增也是非递减,而2100预期结果是[],很显然这里只有包含了本位,即照题目的意思是[1,2]和[2,3],这里只有非递减,这点我也是想了很久,去找了大佬们的解释,还有通过预期结果确定的

那么在代码实现上也会有不同

附上2100的代码

    //2100
    public static List<Integer> goodDaysToRobBank(int[] se, int time) {
    	int n = se.length;
    	List<Integer> list = new LinkedList<>();
    	//要求前后有k个元素,最后返回下标,可以发现 这个题其实就是子数组
    	//dp[i]:以i下标结尾的数组中,构成i(前/后)非递(增/减)的子数组的长度为dp[i]
    	int[]left = new int[n+2];
    	int[]right = new int[n+2];

    	for(int i = 1;i<n;i++) {
    		if(se[i]<=se[i-1]) {
    			left[i+1] = left[i] + 1;
    		}
    	}
    	for(int j = n-2;j>=0;j--) {
    		if(se[j+1]>=se[j]) {
    			right[j+1] = right[j+2] + 1;
    		}
    	}
    	//统计当前位前后是否满足条件,包含本位
    	for(int i = 1;i<=n;i++) {
    		if(left[i]>=time && right[i]>=time) {
    			list.add(i-1);
    		}
    	}
    	return list;
    }

附上2420的代码

    public static List<Integer> goodIndices(int[] nums, int k) {
    	int n = nums.length;
    	List<Integer> list = new LinkedList<>();
    	//要求前后有k个元素,最后返回下标,可以发现 这个题其实就是子数组
    	//dp[i]:以i下标结尾的数组中,构成i(前/后)非递(增/减)的子数组的长度为dp[i]
    	int[]left = new int[n];
    	int[]right = new int[n];
    	//初始化---每个数都置为一,否则无法应对123,k=1这种情况
    	//i本身就满足与i构成非递减非递增的关系
    	//(123满足2前1位非递增,后一位非递减)
        Arrays.fill(left, 1);
        Arrays.fill(right, 1);
    	for(int i = 1;i<n;i++) {
    		if(nums[i]<=nums[i-1]) {
    			left[i] = left[i-1] + 1;
    		}
    	}
    	for(int j = n-2;j>=0;j--) {
    		if(nums[j+1]>=nums[j]) {
    			right[j] = right[j+1] + 1;
    		}
    	}
    	//统计当前位前后是否满足条件,不包含本位
    	for(int i = 1;i<n-k;i++) {
    		if(left[i-1]>=k && right[i+1]>=k) {
    			list.add(i);
    		}
    	}
    	return list;
    }

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

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

相关文章

vue前端框架应用案例(二)实现简单的SPA应用

目录路由使用步骤案例效果案例目录结构App.vueAbout.vueHome.vueindex.jsmain.jsindex.html本博客参考尚硅谷官方课程&#xff0c;详细请参考 【尚硅谷bilibili官方】 本博客以vue2作为学习目标&#xff08;请勿混淆v2与v3的代码规范&#xff0c;否则可能出现报错&#xff09…

docker搭建nacos集群

一、先搭建MySQL主从模式 Nacos使用delby作为内嵌数据库&#xff0c;在使用集群作为部署方式时&#xff0c;内嵌数据库无法保持数据同步与数据一致&#xff0c;故一般使用外接MySQL数据库的方式保存配置文件。使用一主一从的方式搭建&#xff0c;实现主从复制与读写分离。 1.…

线缆也可能是静电危害的罪魁祸首?

众所周知&#xff0c;几乎所有的电子元器件都是对静电敏感的&#xff0c;如果处理不当&#xff0c;将恶化元器件的性能&#xff0c;甚至造成彻底损坏。在低温干燥的环境中&#xff0c;极易产生静电&#xff0c;当然静电主要还是通过摩擦产生的。除了我们所熟知的静电产生的原因…

史上最全的测试用例设计方法

目录 前言 等价类划分方法&#xff1a; 边界值分析方法&#xff1a; 错误推测方法 因果图方法 判定表驱动分析方法 总结 前言 今天还是给大家带来一些干货&#xff0c;总结了一下测试用例的设计方法。具体内容太多我总结成了文档&#xff0c;获取方法在文末。这里截取部…

Swagger2Swagger3

一、什么是Swagger swagger是当下比较流行的实时接口文文档生成工具。接口文档是当前前后端分离项目中必不可少的工具&#xff0c;在前后端开发之前&#xff0c;后端要先出接口文档&#xff0c;前端根据接口文档来进行项目的开发&#xff0c;双方开发结束后在进行联调测试。 所…

Python程序设计之 —— 简易学生信息管理系统

大家好&#xff0c;我是 Enovo飞鱼&#xff0c;今天分享一个 Python程序设计之 —— 简易学生信息管理系统 &#xff0c;小白或者正在学习Python的小伙伴推荐阅读&#xff0c;加油&#x1f4aa;。 目录 前言 Python 简介 Python 特点 一、项目来源及背景 二、功能设计 …

PTA L1-023 输出GPLT(详解)

前言&#xff1a;本期是关于输出GPLT的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字…

概论_第7章_参数估计__区间估计

先看知识结构图 一 置信区间 定义 定义&#xff1a; 设σ\sigmaσ 为总体的未知参数&#xff0c; θ^1θ^1(x1,x2,...,xn),θ^2θ^2(x1,x2,...,xn)\hat \theta_1 \hat\theta_1(x_1,x_2, ..., x_n), \hat \theta_2 \hat\theta_2(x_1,x_2, ..., x_n)θ^1​θ^1​(x1​,x2​,...,x…

YB菜菜的机器学习自学之路(七)——简单了解keras框架

YB菜菜的机器学习自学之路&#xff08;七&#xff09;——简单了解keras框架前提说明1. 机器学习框架-keras1.1 keras框架的特点1.2 keras框架实现一个神经元的建立的过程2. 举例说明2.1 一个神经元 和输入特征为1的案例2.2 多神经元 和单输入特征为1的案例2.3 多输入&#xff…

第11-15章

第11章 枚举和注解 11.1举例 要求创建季节(Season) 对象&#xff0c;请设计并完成。 但是&#xff0c;季节的值是有限的几个值&#xff08;4个季节&#xff09;&#xff0c;不可以再多。 就可以用枚举来解决 枚举&#xff08;enumeration,简写enum&#xff09;,是一组常量的集…

【自学Python】Python字符串对齐教程

Python字符串左对齐 大纲 Python字符串左对齐教程 Python 字符串的左对齐&#xff0c;即在我们需要设定 字符串 为固定的长度时&#xff0c;如果字符串的长度不够&#xff0c;则我们可以指定使用特定的字符在字符串的右边进行填充&#xff0c;从而达到左对齐的目的。 在 Pyt…

请求域名requests.(url = 地址)报错

报错&#xff1a;raise MissingSchema(requests.exceptions.MissingSchema: Invalid URL titles: No scheme supplied. Perhaps you meant http://titles?报错分析&#xff1a;response requests.get(urlurl,headersheaders) # print(response) response.encoding"utf-…

Docker逃逸二三事

Docker逃逸在渗透测试中面向的场景大概是这样&#xff0c;渗透拿到shell后&#xff0c;发现主机是docker环境&#xff0c;要进一步渗透&#xff0c;就必须逃逸到“直接宿主机”。甚至还有物理机运行虚拟机&#xff0c;虚拟机运行Docker容器的情况。那就还要虚拟机逃逸了。所以本…

【LeetCode】2325. 解密消息

给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将替换表与普通英文字母表对齐&#xff0c;形成对照表。按照对照表 替换 messag…

C语言课设作业《通讯录》全程记录 ps:动态版本

写在前面&#xff1a; 通讯录算是前面对学过知识的一个综合运用&#xff0c;涉及到的知识点有 &#xff1a;枚举类型&#xff0c;结构体、结构体指针、动态内存分配(malloc,calloc,realloc,free)、typedef关键字、多文件编程等以上内容&#xff0c;设计思想不是太难&#xff0c…

Java多线程环境下使用的集合类

Java标准库中大部分集合类都是线程不安全的, 多线程环境下使用同一个集合类对象, 很可能会出问题; 只有少部分是线程安全的, 比如: Vector, Stack, HashTable这些, 关键方法都会带有synchronized, 但一般是不推荐使用这几个类的. 一. 多线程环境下使用ArrayList ArrayList在多…

浅析设计模式4——模板方法模式

我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#xff0c;并且降低代码的耦合度。设计模式就是一种可以提高代码可复用性、可维护性、可扩展性以及可读性的解决方案。大家熟知的23种设计模式&#xff0c;可以分为创建型模式、结构型模式和行为型…

OAuth2简介

目录一、 什么是OAuth2二、OAuth2中的角色三、认证流程四、生活中的Oauth2思维五、令牌的特点六、OAuth2授权方式1、授权码2、隐藏方式3、密码方式4、凭证方式一、 什么是OAuth2 OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。 举例说明…

使用Vuex的个人理解

一、逻辑原理 要使用 Vuex 进行集中管理数据&#xff08;状态&#xff09;&#xff0c;按照 Vuex 分模块的设 计思想&#xff0c;先在 src 下创建 store 文件夹&#xff0c;然后创建一个根级别的 index.js&#xff0c;作为组装模块并导出 store 地方&#xff08;store 对象是 …

xss.haozi.me通关教程

10.xss.haozi.me通关教程 0x00 首先整体浏览网站 分别是xss注入点&#xff0c;注入后的HTML代码以及网页源码 构造常规payload&#xff1a; <script>alert(1)</script> 成功通关 0x01 看到注入点是在标签中, 所以用上一题的方法是不会被解析的, 故需要去构造…