当前位置:网站首页>LeetCode 刷题 第三天
LeetCode 刷题 第三天
2022-07-27 16:18:00 【太阳在坠落】
1. 旋转数组中的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
分析:
使用二分查找。与传统的二分查找不同,每次需要把middle位置的值与high位置的值比较。如果middle位置的值大于high位置的值,最小值则在middle左侧的空间;如果middle位置的值小于high位置的值,最小值则在middle右侧的空间;如果middle位置的值等于high位置的值,则high--。

class Solution {
public int minArray(int[] numbers) {
int low = 0;
int high = numbers.length - 1;
while (low < high) {
int pivot = low + (high - low) / 2;
if (numbers[pivot] < numbers[high]) {
high = pivot;
} else if (numbers[pivot] > numbers[high]) {
low = pivot + 1;
} else {
high -= 1;
}
}
return numbers[low];
}
}
2. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
分析:
深度优先遍历。定义i,j为矩阵的行坐标与列坐标。在进行遍历的时候,只有当前matrix[i][j]==word[k], k<word.length时,遍历才会继续,否则则终止返回false,当k==word.length-1时代表查找成功。注意要标记已经遍历过的点,防止再次遍历。
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(dfs(board, words, i, j, 0)) return true;
}
}
return false;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
if(k == word.length - 1) return true;
board[i][j] = '\0';//标记已访问过
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
board[i][j] = word[k];
return res;
}
}
3. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
分析:
深度优先遍历。
- 深度优先搜索: 可以理解为暴力法模拟机器人在矩阵中的所有路径。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
- 剪枝: 在搜索中,遇到数位和超出目标值、此元素已访问,则应立即返回,称之为 可行性剪枝 。
- 算法解析:
- 递归参数: 当前元素在矩阵中的行列索引 i 和 j ,两者的数位和 si, sj 。
- 终止条件: 当 ① 行列索引越界 或 ② 数位和超出目标值 k 或 ③ 当前元素已访问过 时,返回 00 ,代表不计入可达解。
- 递推工作:
- 标记当前单元格 :将索引 (i, j) 存入 Set visited 中,代表此单元格已被访问过。
- 搜索下一单元格: 计算当前元素的 下、右 两个方向元素的数位和,并开启下层递归 。
- 回溯返回值: 返回 1 + 右方搜索的可达解总数 + 下方搜索的可达解总数,代表从本单元格递归搜索的可达解总数。
class Solution {
int m, n, k;
boolean[][] visited;
public int movingCount(int m, int n, int k) {
this.m = m; this.n = n; this.k = k;
this.visited = new boolean[m][n];
return dfs(0, 0, 0, 0);
}
public int dfs(int i, int j, int si, int sj) {
if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;
visited[i][j] = true;
return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj) + dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8);
}
}
4. 剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
分析:
一个数学问题。将绳子 以相等的长度等分为多段 ,得到的乘积最大。尽可能将绳子以长度 3 等分为多段时,乘积最大。
切分规则:
- 最优: 3。把绳子尽可能切为多个长度为 3 的片段,留下的最后一段绳子的长度可能为 0,1,2三种情况。
- 次优: 2 。若最后一段绳子长度为 2 ;则保留,不再拆为 1+1 。
- 最差: 1 。若最后一段绳子长度为 1;则应把一份 3 + 1替换为 2 + 2,因为 2 *2 > 3 *1
class Solution {
public int cuttingRope(int n) {
if(n <= 3) return n - 1;
int a = n / 3, b = n % 3;
if(b == 0) return (int)Math.pow(3, a);
if(b == 1) return (int)Math.pow(3, a - 1) * 4;
return (int)Math.pow(3, a) * 2;
}
}
边栏推荐
- MySQL 主从复制数据不一致,怎么办?
- Login page tablelayout
- Use mobaxtermto establish a two-tier springboard connection
- I was forced to optimize the API gateway query interface
- Wechat applet obtains openid, sessionkey, unionid
- ERROR 1366 (HY000): Incorrect string value: ‘\xE8\xB5\xB5\xE9\x9B\xB7‘ for column ‘s_ name‘ at row 1
- 商品推荐和分类商品推荐
- Uni app for wechat login (to be finished)
- Solve the problem of JSP cascading
- MySQL set validate_ Adding skip grant tables after password=off failed to start the service
猜你喜欢

USB充电式暖手宝芯片-DLTAP602SC-杰力科创

音乐律动七彩渐变灯芯片--DLT8S04A-杰力科创

nacos显示服务注册地址错误

Solve the problem of JSP cascading

全身多功能按摩仪芯片-DLTAP602SD

浴室带除雾化妆镜触摸芯片-DLT8T10S

2021.7.28 notes

Order timeout cancellation and commodity query by category

Knowledge map pyhanlp realizes named body recognition (with named body recognition code)

I was forced to optimize the API gateway query interface
随机推荐
知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)
使用jieba、pyhanlp工具实现关键字词句的提取
LED带风扇护眼学习台灯触摸芯片-DLT8S12A
兆骑科创海内外引进高层次人才,创新创业项目对接
pygame飞机大战游戏背景实现
MySQL basic statement
百度地图技术概述,及基本API与WebApi的应用开发
Knowledge map - Jieba, pyhanlp, smoothnlp tools to realize Chinese word segmentation (part of speech)
Uni app for wechat login (to be finished)
图文结合,完美解释MySQL逻辑备份的实现流程
机器学习——SVM训练集只有一类标签数据而引发的错误
Aircraft battle with enemy aircraft
Wechat applet wechat payment overview
Pandas' to_ SQL function usage
MySQL learning day3 multi table query / transaction / DCL
电动加热护颈枕芯片-DLTAP703SC
Login page tablelayout
Aircraft collision detection
10 SQL optimization schemes summarized by Alibaba P8 (very practical)
"MySQL things" explains the indexing principle in detail