diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b16691b57..45c08cc7d 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -155,6 +155,7 @@ - [0136. 只出现一次的数字 Single Number](leetcode/0136.single-number/index.md) - [0137. 只出现一次的数字II Single Number II](leetcode/0137.single-number-ii/index.md) - [0167. 两数之和 II - 输入有序数组 Two Sum II - Input Array Is Sorted](leetcode/0167.two-sum-ii-input-array-is-sorted/index.md) + - [0189. 旋转数组 Rotate Array](leetcode/0189.rotate-array/index.md) - [0191. 位1的个数 Number of 1 Bits](leetcode/0191.number-of-1-bits/index.md) - [0201-0300](leetcode/by-id/0201-0300.md) - [0217. 存在重复元素 Contains Duplicate](leetcode/0217.contains-duplicate/index.md) diff --git a/src/array/rotate.md b/src/array/rotate.md index b39f6ef46..568cb6c8c 100644 --- a/src/array/rotate.md +++ b/src/array/rotate.md @@ -27,7 +27,7 @@ {{#include assets/rotate.rs:7:50}} ``` -## 方法2: 使用数组反转 +## 方法2: 三次反转法 操作过程如下: diff --git a/src/leetcode/0189.rotate-array/index.md b/src/leetcode/0189.rotate-array/index.md index aad860fcd..d456ad863 100644 --- a/src/leetcode/0189.rotate-array/index.md +++ b/src/leetcode/0189.rotate-array/index.md @@ -1,3 +1,21 @@ -# +# 旋转数组 Rotate Array [问题描述](https://leetcode.com/problems/rotate-array/) + +## 三次反转法 + +操作过程如下: + +1. 将 `arr[k..n]` 进行反转 +2. 将 `arr[0..k]` 进行反转 +3. 将 `arr[..]` 进行反转 + +这个方法是在原地操作的, 其时间复杂度是 `O(n)`, 空间复杂度是 `O(1)`. + +```rust +{{#include src/main.rs:31:49}} +``` + +## 参考 + +- [旋转数组](../../array/rotate.md) \ No newline at end of file diff --git a/src/leetcode/0189.rotate-array/src/main.rs b/src/leetcode/0189.rotate-array/src/main.rs index 223fd72d8..7003aebcf 100644 --- a/src/leetcode/0189.rotate-array/src/main.rs +++ b/src/leetcode/0189.rotate-array/src/main.rs @@ -28,7 +28,7 @@ pub fn rotate1(nums: &mut Vec, k: i32) { } } -// 三次翻转. +// 三次反转法 pub fn rotate2(nums: &mut Vec, k: i32) { // 检查边界条件 if nums.is_empty() || k <= 0 { @@ -40,46 +40,14 @@ pub fn rotate2(nums: &mut Vec, k: i32) { return; } - // 第一步, 把所有元素做翻转. + // 第一步, 把所有元素做反转. nums.reverse(); - - // 第二步, 找到右移的分界线 k, 把 [0..k] 做翻转; 把 [k..len] 做翻转 + // 第二步, 找到右移的分界线 k, 把 [0..k] 做反转. nums[0..k].reverse(); + // 第三步, 把 [k..len] 做反转 nums[k..].reverse(); } -// 三次翻转, 但使用靠拢型双指针实现反转函数. -pub fn rotate3(nums: &mut Vec, k: i32) { - fn reverse_array(nums: &mut [i32], mut start: usize, mut end: usize) { - let mut temp; - while start < end { - // nums.swap(start, end); - temp = nums[start]; - nums[start] = nums[end]; - nums[end] = temp; - start += 1; - end -= 1; - } - } - - // 检查边界条件 - if nums.is_empty() || k <= 0 { - return; - } - let len: usize = nums.len(); - let k: usize = (k as usize) % len; - if k == 0 { - return; - } - - // 第一步, 把所有元素做翻转. - reverse_array(nums, 0, len - 1); - - // 第二步, 找到右移的分界线 k, 把 [0..k] 做翻转; 把 [k..len] 做翻转 - reverse_array(nums, 0, k - 1); - reverse_array(nums, k, len - 1); -} - pub type SolutionFn = fn(&mut Vec, i32); fn check_solution(func: SolutionFn) { @@ -97,12 +65,11 @@ fn check_solution(func: SolutionFn) { fn main() { check_solution(rotate1); check_solution(rotate2); - check_solution(rotate3); } #[cfg(test)] mod tests { - use super::{check_solution, rotate1, rotate2, rotate3}; + use super::{check_solution, rotate1, rotate2}; #[test] fn test_rotate1() { @@ -113,9 +80,4 @@ mod tests { fn test_rotate2() { check_solution(rotate2); } - - #[test] - fn test_rotate3() { - check_solution(rotate3); - } }