当前位置:网站首页>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;
}
}
边栏推荐
- Uni app for wechat login (to be finished)
- Part of speech list of common words
- Have you ever stumbled on MySQL's order by
- 如何实现Word、PDF、TXT文件的全文内容检索?
- MySQL learning Day1 DDL, DML, DQL basic query
- 全身多功能按摩仪芯片-DLTAP602SD
- Preliminary introduction to C miscellaneous lecture linked list
- Use mobaxtermto establish a two-tier springboard connection
- MySQL set validate_ Adding skip grant tables after password=off failed to start the service
- How to realize the full-text content retrieval of word, PDF and txt files?
猜你喜欢

2021.8.9 note request

MySQL learning day3 multi table query / transaction / DCL

机器学习分类任务效果评估指标大全(包含ROC和AUC)

Uploading and downloading of files

MySQL查询列必须和group by字段一致吗?

Uni app label jump

Nacos display service registration address error

百度地图鹰眼轨迹服务

Solve the problem of JSP cascading

Idea 2020.1 Community Edition download experience
随机推荐
2021.8.7 note Servlet
Log4j epic loopholes, big companies like jd.com have been recruited
图文结合,完美解释MySQL逻辑备份的实现流程
兆骑科创海内外引进高层次人才,创新创业项目对接
INSUFFICIENT_ ACCESS_ ON_ CROSS_ REFERENCE_ ENTITY APEX / SALESFORCE
ridis命令笔记
The song of the virtual idol was originally generated in this way!
如何实现Word、PDF、TXT文件的全文内容检索?
迷你洗衣机触摸芯片-DLT8MA12TS-杰力科创
瑞吉外卖笔记
Uni app form submit button send request
Personal Center - order business process
智能失眠治疗仪产品-DLT8P68SA-杰力科创
nacos显示服务注册地址错误
The second parameter of fragmenttransaction.replace reports an error
Knowledge map pyhanlp realizes named body recognition (with named body recognition code)
10 SQL optimization schemes summarized by Alibaba P8 (very practical)
商品评论信息与评论信息分类
Was not registered for synchronization because synchronization is not active[resolved]
知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)