79. 单词搜索
题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
解题思路
深度优先遍历 + 回溯。
代码实现
class Solution {
char[] target;
public boolean exist(char[][] board, String word) {
if(word.length() == 0){
return false;
}
target = word.toCharArray();
//遍历矩阵行列
int rows = board.length, cols = board[0].length;
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if(check(board, i, j, 0)){
return true;
}
}
}
return false;
}
//判断从board[i][j]出发是否存在路径word.subString(index, length - 1)
public boolean check(char[][] board, int i, int j, int index){
if(index >= target.length){
//已找完全部
return true;
}
if(outOfBound(board, i, j) || board[i][j] != target[index]){
return false;
}
//防止重复查找
board[i][j] = '0';
if(check(board, i + 1, j, index + 1) || check(board, i - 1, j, index + 1)
|| check(board, i, j + 1, index + 1) || check(board, i, j - 1, index + 1)){
return true;
}
//还原数组元素(撤销选择)
board[i][j] = target[index];
return false;
}
//判断数组下标是否越界
public boolean outOfBound(char[][] board, int i, int j){
if(i < 0 || i >= board.length || j < 0 || j >=board[0].length){
return true;
}
return false;
}
}
153. 寻找旋转排序数组中的最小值
问题描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。
请找出其中最小的元素。
- 1 <= nums.length <= 5000
- -5000 <= nums[i] <= 5000
- nums 中的所有整数都是 唯一 的
- nums 原来是一个升序排序的数组,但在预先未知的某个点上进行了旋转
解题思路1-暴力法
从头到尾遍历数组,找到最小值。
代码实现1-暴力法
class Solution {
public int findMin(int[] nums) {
int min = nums[0];
for(int i = 1; i < nums.length; i++){
if(nums[i] < min){
min = nums[i];
}
}
return min;
}
}
- 时间复杂度O(n),n为数组中的元素
解题思路2-二分查找
使用左闭右开区间,保证最小值始终在这里面。
代码实现2-二分查找
class Solution {
public int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
if(nums[left] < nums[right]){
//数组未被旋转,直接返回最小值
return nums[left];
}
while(left < right){
int mid = left + (right - left) / 2;
if(nums[right] < nums[mid]){
left = mid + 1;
}else{
right = mid;
}
}
return nums[left];
}
}
网友评论