79. 单词搜索 Word Search
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和word
仅由大小写英文字母组成
进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
代码:
fn exist(board: Vec<Vec<char>>, word: String) -> bool { let mut board = board; let m = board.len(); let n = board[0].len(); for i in 0..m { for j in 0..n { if search(&mut board, &word, i, j, 0) { return true; } } } false } fn search(board: &mut Vec<Vec<char>>, word: &String, i: usize, j: usize, k: usize) -> bool { if k == word.len() { return true; } if i >= board.len() || j >= board[i].len() || board[i][j] != word.chars().nth(k).unwrap() { return false; } let c = board[i][j]; board[i][j] = '#'; // 标记已访问 if search(board, word, i + 1, j, k + 1) || search(board, word, i, j + 1, k + 1) || search(board, word, i - 1, j, k + 1) || search(board, word, i, j - 1, k + 1) { return true; } board[i][j] = c; // 还原 false } fn main() { let board = vec![ vec!['A', 'B', 'C', 'E'], vec!['S', 'F', 'C', 'S'], vec!['A', 'D', 'E', 'E'], ]; println!("{}", exist(board, String::from("ABCCED"))); }
输出:
true
true
false
80. 删除有序数组中的重复项 II Remove-duplicates-from-sorted-array-II
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
nums
已按升序排列
相关题目: 26. 删除有序数组中的重复项
代码:
fn remove_duplicates(nums: &mut Vec<i32>) -> i32 { if nums.len() <= 2 { return nums.len() as i32; } let mut i = 1; for j in 2..nums.len() { if nums[j] != nums[i - 1] { i += 1; nums[i] = nums[j]; } } (i + 1) as i32 } fn main() { let mut nums = vec![1, 1, 1, 2, 2, 3]; println!("{}", remove_duplicates(&mut nums)); let mut nums = vec![0, 0, 1, 1, 1, 1, 2, 3, 3]; println!("{}", remove_duplicates(&mut nums)); }
输出:
5
7
81. 搜索旋转排序数组 II Search-in-rotated-sorted-array-II
已知存在一个按非降序排列的整数数组 nums
,数组中的值不必互不相同。
在传递给函数之前,nums
在预先未知的某个下标 k
(0 <= k < nums.length
)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7]
在下标 5
处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]
。
给你 旋转后 的数组 nums
和一个整数 target
,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums
中存在这个目标值 target
,则返回 true
,否则返回 false
。
你必须尽可能减少整个操作步骤。
示例 1:
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
示例 2:
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
- 题目数据保证
nums
在预先未知的某个下标上进行了旋转 -10^4 <= target <= 10^4
进阶:
- 这是搜索旋转排序数组(题号33)的延伸题目,本题中的
nums
可能包含重复元素。 - 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
代码:
fn search(nums: &Vec<i32>, target: i32) -> bool { let (mut left, mut right) = (0, nums.len() - 1); while left <= right { let mid = left + (right - left) / 2; if nums[mid] == target { return true; } // 无法确定左右区间是否有序,只能缩小范围 if nums[left] == nums[mid] && nums[mid] == nums[right] { left += 1; if right > left { right -= 1; } } else if nums[left] <= nums[mid] { // 左区间有序 if nums[left] <= target && target < nums[mid] { right = mid - 1; } else { left = mid + 1; } } else { // 右区间有序 if nums[mid] < target && target <= nums[right] { left = mid + 1; } else { right = mid - 1; } } } false } fn main() { let nums = vec![2, 5, 6, 0, 0, 1, 2]; println!("{}", search(&nums, 0)); println!("{}", search(&nums, 3)); }
输出:
true
false
🌟每日一练刷题专栏🌟
✨持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Rust每日一练 专栏 (2023.5.16~)更新中... |
|
Golang每日一练 专栏 (2023.3.11~)更新中... |
|
Python每日一练 专栏 (2023.2.18~2023.5.18)暂停更 |
|
C/C++每日一练 专栏 (2023.2.18~2023.5.18)暂停更 |
|
Java每日一练 专栏 (2023.3.11~2023.5.18)暂停更 |