每天几道高频算法题-DAY1

从今天开始 每天做几道高频算法题 备战秋招 如果有算法还没刷题的(买不起LeetCode会员的) 可以和我一起刷

题目一

给定一个有序数组arr,从左到右依次表示X轴上从左往右点的位置,给定一个正整数K,返回如果有一根长度为K的绳子,最多能盖住几个点绳子的边缘点碰到X轴上的点,也算盖住

思路1:

最暴力解的话就是把绳子的开头 放在每一个点上 然后遍历出结果之后选一个最大值 这样的话时间复杂度会达到O(N)

思路2:

这个方法是使用了滑动窗口法的变种,维护一个数组作为窗口,先以arr[0]为窗口的头部

然后判断窗口最多能拓展到哪个节点 然后窗口左侧滑动一个单位(就是以arr[1]开头了 本质上是窗口头部向右走了一个元素),然后再看窗口最远可以包含住哪个节点,用max抓住以每个数为开头的最大节点;

public static int MaxPoint(int K,int [] arr) {int left = 0;int right = 1;int max = Integer.MIN_VALUE;while(left<arr.length) {while(right<arr.length) {if(arr[right] - arr[left]<=K) {		right++;}else {break;}}max = Math.max((right-left),max);left++;}return max;}


题目二

括号有效配对是指:
1)任何一个左括号都能找到和其正确配对的右括号
2)任何一个右括号都能找到和其正确配对的左括号
有效的: (())()()(()())等
无效的:(())(等
问题一:怎么判断一个括号字符串有效?
问题二:如果一个括号字符串无效,返回至少填几个字符能让其整体有效

问题三:返回一个括号字符串中,最长的括号有效长度()   红色困难

问题一 

很简单问题1 无论是单调栈法 还是遍历法都可以 这里只做最优解

我们定一个整形 初始为0 遍历字符串遇到一个左括号加1遇到一个右括号减1 但是如果它变成负数了 直接跳出循环 返回为假

对于左括号来说 只要右边有和它配对的右括号 就算有效

但是对于右括号来说 如果它的左边没有和它配对的左括号 那后面有一万个左括号也不好使了

public static boolean Islegal(String string) {int count = 0;char [] chars = string.toCharArray();for (char c : chars) {if(c=='(') {count++;}else if(c==')') {count--;}if(count<0) {return false;}}if(count==0) {return true;}return false;}

问题二

public static int Islegal(String string) {int count = 0;int result = 0;char [] chars = string.toCharArray();for (char c : chars) {if(c=='(') {count++;}else if(c==')') {count--;}if(count<0) {result++;count = 0;}}result += count;return result;}

和问题一大概流程一致 需要注意的点是 当count<0的时候表示现在有一个)没有匹配 所以我们要立刻把result加一 因为如果不处理的话 后面会有一个左括号加上 然后result变成0 这很显然是逻辑不通的 例:)(  这样虽然result为0 但实际上并不合规 

问题三

最暴力的解法是遍历以每一个字符结尾(或开头)的字符串 然后找出最大值,经典O(N²)复杂度

有只遍历字符串一遍的做法

创建一个与字符数组等长的数组 每个数组的元素放 以当前位置结尾的最长有效字符串

仅仅是这样的话似乎和全遍历没啥区别 优化在于

1.以左括号结尾的字符串 以当前位置结尾的最长有效字符串长度肯定为0(此后用'值'来表示)

2.以右括号结尾的字符串的值,假设当前位置为M位 看它前一位 假如说 前一位的值为N 那么就看往前推N位的情况(M-N-1位)

如果M-N-1位是左括号 说明有效 那么当前位置的值 就是N的值+2 然后再往前看一位M-N位的值把它也加上

如果M-N+1位是右括号 很遗憾 当前位置的值为0

 public int longestValidParentheses(String s) {if(s==null||s.length()<2){return 0;}char [] chars = s.toCharArray();int [] arr = new int [chars.length];arr[0] = 0;int max = 0;for(int i = 1;i<arr.length;i++) {if(chars[i]=='(') {arr[i] = 0;//其实不用这一步 默认就是0}else if(chars[i]==')') {int t = i - arr[i-1] - 1;if(t>=0&&chars[t]=='(') {arr[i] = arr[i-1]+2+(t>0?arr[t-1]:0);}}max = Math.max(max, arr[i]);}return max;}

力扣链接 原题在这里

第三题

有一些排成一 行的正方形。每个正方形已经被染成红色或者绿色。现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖,目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。返回最少需要涂染几个正方形。如样例所示:s= RGRGR我们涂染之后变成RRRG满足要求了涂染的个数为2,没有比这个更好的涂染方案

这里的每个红色R比绿色G距离左侧近 说人话就是 所有的红色都应该在绿色的左边

最暴力的解法是 我们遍历每两个格子之间的分界线(包括第一个格子前和 最后一个格子后)

然后把分界线前面全涂成红色 分界线后面全涂成绿色 复杂度是O(N²)

优化解法就是 先过一遍字符串 然后做一个预处理数组  某位置 左侧有多少个G 右侧有多少个R

然后再拿着这个结果 去遍历分界线 就变得简单了

具体实现的话还可以优化一下 先遍历下字符串 看看R总共有多少个 这样从左往右结算的时候 不仅能得出左侧的G有多少个 又能得出右侧的R有多少个 每个位置都计算要涂多少个格子 然后用一个MIN抓住最小的 

 public static int MinMethod(String string) {char [] chars = string.toCharArray();int LeftG = 0;int RightR = 0;int RALL = 0 ;for (char c : chars) {RALL += c=='R'?1:0;}int min = RALL;//对应着把所有的R都涂了 也就是以第一位之前为分界线RightR = RALL;for (char c :chars) {LeftG += (c=='G'?1:0);RightR -= (c=='R'?1:0);min = Math.min(LeftG+RightR, min);}return min;}


本来想着今天还能多做几道呢 看了会MYSQL 一抬眼九点了 所以今天就先这样

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

820. 递归求斐波那契数列

链接&#xff1a; 原题 题目&#xff1a; 请使用递归的方式求斐波那契数列的第 nn 项&#xff0c;下标从1开始。 斐波那契数列&#xff1a;1,1,2,3,5…1,1,2,3,5…&#xff0c;这个数列从第 33 项开始&#xff0c;每一项都等于前两项之和 输入格式 共一行&#xff0c;包含整数 …

卷积神经网络

目录 1、卷积运算 2、使用卷积运算实现垂直边缘检测 3、区分正边、负边 4、计算输出矩阵大小 5、边缘填充方法 6、卷积步长 7、三维卷积 8、单层卷积网络 9、卷积层的各种标记 10、简单卷积网络 11、池化层 12、卷 积 神 经 网 络 示 例 1、卷积运算 使用灰度图像…

保姆级指针进阶教程——【C语言】

在之前的博客中&#xff0c;我简单的介绍了什么是指针、指针的大小、运算、二级指针等等一些指针的基础知识&#xff0c;接下来我将带大家深入的了解一下指针&#xff0c;保证让大家对指针有更深刻的理解。 目录 字符指针 指针数组 数组指针 数组名VS&数组名 数组指针的…

第十二章 elk

1、ELK可以帮助我们解决哪些问题 日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志 单个日志文件巨大,无法使用常用的文本工具分析,检索困难; 2、架构设计分析 Filebeat和Logstash ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、i…

Spring IOC - Bean的扫描

Component及其衍生注解&#xff1a;Configuration、Controller、Service、Repository标记的类&#xff0c;被Spring IOC扫描到后&#xff0c;即可被容器管理起来。其原理基本涵盖在AnnotationConfigApplicationContext构造函数体的三行代码里。 public AnnotationConfigApplic…

6阶高清视频滤波驱动MS1681

MS1681 是一个单通道视频缓冲器&#xff0c;它内部集成6dB 增益的轨到轨输出驱动器和6 阶输出重建滤波器。MS1681 的-3dB 带宽为35MHz&#xff0c;压摆率为160V/us。MS1681 比无源LC 滤波器与外加驱动的解决方案能提供更好的图像质量。它单电源供电范围为2.5V 到5.5V&#xff0…

检验样本正态性

简介 在统计学中很多推论与正态分布有关&#xff0c;并且很多统计量构造为满足正态分布的形式&#xff0c;很多分布在特定条件近似于正态分布。因此&#xff0c;在统计推断中经常需要判断样本的正态性。本文介绍一些常用的方法。 环境和数据准备&#xff1a; import numpy a…

【Go】Go 语言教程--GO语言数组(十一)

往期回顾&#xff1a; Go 语言教程–介绍&#xff08;一&#xff09;Go 语言教程–语言结构&#xff08;二&#xff09;Go 语言教程–语言结构&#xff08;三&#xff09;Go 语言教程–数据类型&#xff08;四&#xff09;Go 语言教程–语言变量&#xff08;五&#xff09;Go …

Echarts使用,大数据量时,折线图曲线Y轴取值刻度不正确

如下图&#xff0c;当数据量过大时&#xff0c;会出现数值对应Y轴刻度显示不正确问题。 ​​​​​​​ 可检查配置项是否存在sampling字段 option {series: [{data: [...],type: line,smooth: true,symbolSize: 0,sampling: "average", // 注意此行}] }; samplin…

fpga下载程序到flash后无法在重新上电后自动加载程序

是器件的约束配置问题&#xff0c;这是正点原子artix7用的器件配置&#xff0c;如果不用就有问题 # 器件 set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property CONFIG_MODE SPIx4 [current_design] set_property BITST…

WH5097D有源矩阵驱动的Mini LED背光应用方案

Miniled技术为lcd的全面升级版&#xff0c;Miniled的背光层在单位面积内可以容纳更多LED&#xff0c;从而大大提高背光源数量&#xff0c;因此可以进行区域亮度调节的设计&#xff0c;从而在个别区域实现关闭led从而达到完全的黑色&#xff0c;不仅减小了功耗&#xff0c;而且由…

Mac 和 Win,到底用哪个系统学编程?

今天来聊一个老生常谈的问题&#xff0c;学编程时到底选择什么操作系统&#xff1f;Mac、Windows&#xff0c;还是别的什么。。 作为一个每种操作系统都用过很多年的程序员&#xff0c;我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…