当前位置:网站首页>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;
}
}
边栏推荐
- Must the MySQL query column be consistent with the group by field?
- 全自动吸奶器芯片-DLTAP703SD
- 2021.8.9 note request
- Was not registered for synchronization because synchronization is not active[resolved]
- 商品推荐和分类商品推荐
- 2021.7.17 notes MySQL other commands
- 百度地图鹰眼轨迹服务
- How to send external mail to the company mailbox server on the Intranet
- Wechat payment and payment callback
- What if MySQL database forgets its password???
猜你喜欢

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

Alibaba architects spent 280 hours sorting out 1015 pages of distributed full stack pamphlets to easily start the distributed system

使用jieba、pyhanlp工具实现关键字词句的提取

Must the MySQL query column be consistent with the group by field?

2021.8.7 note Servlet

微信支付及支付回调

电动加热护颈枕芯片-DLTAP703SC

MySQL learning Day1 DDL, DML, DQL basic query

20000 words + 30 pictures | what's the use of chatting about MySQL undo log, redo log and binlog?

MySQL learning day3 multi table query / transaction / DCL
随机推荐
瑞吉外卖sql表
虚拟偶像的歌声原来是这样生成的!
知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)
常用词词性表
Quick access to website media resources
Wechat applet multi file upload
RuntimeError: output with shape [1, 256, 256] doesn‘t match the broadcast shape [3, 256, 256]【报错】
建木持续集成平台v2.5.2发布
百度地图技术概述,及基本API与WebApi的应用开发
Generate PDM file from Navicat export table
Log4j 史诗级漏洞,京东这样的大厂都中招了
Alibaba architects spent 280 hours sorting out 1015 pages of distributed full stack pamphlets to easily start the distributed system
2021.7.30 note index
Build a simple knowledge question and answer system
2021.8.7 note Servlet
Uni app form submit button send request
Basic operations of MySQL view
What does the number of network request interface layers (2/3 layers) mean
The song of the virtual idol was originally generated in this way!
Ant privacy computing innovation tee technology has won academic recognition