1706. 球会落何处 / 680. 验证回文字符串 Ⅱ
1706. 球会落何处【中等题】【每日一题】
思路:
- 单看每一行,必须是小球所在的列跟它左右两侧至少有一侧的挡板方向相同才能使小球滚动下去,否则就卡住了,具体点说就是,设小球当前所在列下标为i,那么如果i处为1(即挡板右置),那么i+1必须也为1,如果i处为-1(即挡板左置),那么i-1必须也为-1,特殊情况,当i=0时,挡板不能左置,即不能为-1,当i=len-1(len为列数)时,挡板不能右置,即不能为1。
- 从上往下的行联系起来,我们可以定义一个函数judge,从第0行开始逐层往下判断,如果球不会被卡住,那么让球继续往下滚,此时需要记录球当前所在的列,如果球被卡住,那么直接在ans中这个球的起始位置处返回-1。
- 考虑到第2步即需要判断小球是否能通过当前行,又需要记录小球在通过当前行后位置的变化,于是设计函数judge的返回值为int[]数组,第一个位置表示状态,0表示小球不能通过,1表示可以通过,第2个位置表示小球位置的变化,1表示右移1位,-1表示左移1位。
- 定义clen表示grid的列数,定义ans数组用来存储小球掉落下来时所在列的下标。
- for循环遍历ans数组,i表示ans数组的当前下标。定义col_index表示小球所在的列下标,初值为当前列下标。定义flag标志位判断小球是否可以顺利通过当前层,默认为true。增强for循环遍历grid每一行,(可以抽象为大楼的每一层),每一行用ints表示,将每一行和小球当前列位置col_index丢进judge函数进行处理,返回status数组,如果status[0]不为0,那么col_index更新为col_index+status[1],否则说明小球被卡住了,flag置为false,退出当前增强for循环。如果flag为true,说明小球可以顺利降落,此时col_index即为降落的列位置,将其存入ans[i]中,如果flag为false,说明小球不能顺利降落,ans[i]置为-1。
- 外层for循环遍历结束,说明所有的小球都判断完毕,返回ans。
代码:
class Solution {public int[] findBall(int[][] grid) {int clen = grid[0].length;int[] ans = new int[clen];for (int i = 0; i < clen; i++) {int col_index = i;boolean flag = true;for (int[] ints : grid) {int[] status = judge(ints, col_index);if (status[0] != 0) {col_index += status[1];} else {flag = false;break;}}if (flag){ans[i] = col_index;}else {ans[i] = -1;}}return ans;}public int[] judge(int[] rows,int i){if (rows[i] == 1){if (i == rows.length-1){return new int[]{0,0};}else {if (rows[i+1] == 1){return new int[]{1,1};}else{return new int[]{0,0};}}}else {if (i == 0){return new int[]{0,0};}else {if (rows[i-1] == -1){return new int[]{1,-1};}else{return new int[]{0,0};}}}}
}
用时:
我感觉我这复杂度也是O(mn)呀,但是比题解慢了1ms。
680. 验证回文字符串 Ⅱ【简单题】
思路:【双指针】【看题解】
- 定义左指针left=0,右指针right=s.length()-1;当left<right时,进入while循环,如果左指针对应的字符与右指针相同,则left++,right–继续比较,否则:则截取left右侧1位与right之间或者left与right左侧1位之间的字符串判断其是否是回文串,如果是,那么由于这个截取的字符串两侧的字符全是相同的,那么如果这个截取字符串是回文串,再加上外边两侧的字符那依然还是回文串。
- 上述截取子串的端点即是删除左指针或右指针字符之后,字符串未判断字符的两端。
代码:
class Solution {public boolean validPalindrome(String s) {int left = 0,right = s.length()-1;while (left<right){if (s.charAt(left) != s.charAt(right)){return isValid(s.substring(left+1,right+1)) || isValid(s.substring(left,right));}else {left++;right--;}}return true;}public boolean isValid(String str){int left = 0,right = str.length()-1;while (left<right){if (str.charAt(left++) != str.charAt(right--)){return false;}}return true;}
}
1706. 球会落何处 / 680. 验证回文字符串 Ⅱ相关推荐
- 680. 验证回文字符串 Ⅱ
680. 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: s = "aba" 输出: true 示例 2: 输入: s ...
- 力扣--125验证回文串/680验证回文字符串II
125验证回文串 python代码 常规 def isPalindrome(s):if len(s) < 2:return TruesList = []s = s.lower()print(s) ...
- leetcode系列--680.验证回文字符串 Ⅱ
leetcode系列–第680题.验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 输入: s = "abca" 输出: true 解释: ...
- 680. 验证回文字符串 Ⅱ golang
题目 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "a ...
- LeetCode 680. 验证回文字符串 Ⅱ
1. 题目 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True示例 2: 输入: "abca" ...
- LeetCode 680 验证回文字符串 Ⅱ
题目描述 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 题解 使用双指针进行遍历,不满足条件则进行删除,由于不知道要删除哪一个,则均进行判断. 代码 class Solutio ...
- 2022-1-13 Leetcode 680.验证回文字符串 II
class Solution {public:bool validPalindrome(string s) {int n = s.size();// for(int i = 0;i < n/2; ...
- [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]
[问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...
- 把数组排成最小的数字,划分字母区间,最小覆盖子串,验证回文字符串II
面试题45:把数组排成最小的数字 输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.这里自定义了一个排序规则. class Solution { publi ...
最新文章
- Centos系统上安装php遇到的错误解决方法集锦
- 《可穿戴创意设计:技术与时尚的融合》一一第3章 从纺织品到可穿戴设备
- 在Ubuntu下搭建FTP服务器的方法
- c++ 为什么要按它们声明的顺序初始化成员变量?
- 热门项目:高精度图像分类全流程开发
- 客户端VS2010 Team Foundation Server中删除项目
- Linux的互斥锁、条件锁的用法
- lego ev3 c语言编程,乐高 EV3 高级编程 – 第一课:安装
- win8 32位系统上如何运行校园翼讯客户端
- LR录制https协议报证书错误,导航已阻止
- 【C语言】扫雷游戏详解及完整代码
- ios计算机隐藏功能,10个iOS12使用技巧和隐藏功能,让你快人一步成为玩机达人...
- 【浏览器】解决火狐和Chrome上不了网,只有IE能上网的问题
- 第5篇-分析北京租房的房源信息
- xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 13 面向对象-继承与抽象类
- 如何将本地图片变为网络图片
- 组合数学——二项式反演
- 我理想中的分析师 !
- 《程序员升职记》/《Human Resource Machine》黑屏解决办法