Skip to content

Commit cae5572

Browse files
committed
Solve problem 0189 & 0242
1 parent e093775 commit cae5572

File tree

6 files changed

+185
-0
lines changed

6 files changed

+185
-0
lines changed

Diff for: 0189-Rotate-Array/Animation/189.gif

1.37 MB
Loading

Diff for: 0189-Rotate-Array/Animation/189.m4v

924 KB
Binary file not shown.

Diff for: 0189-Rotate-Array/Article/0189-Rotate-Array.md

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# LeetCode第 189 号问题:旋转数组
2+
3+
> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
4+
>
5+
> 同步博客:https://www.algomooc.com
6+
7+
题目来源于 LeetCode 上第 189 号问题:旋转数组。题目难度为 Easy,目前通过率为 41.7% 。
8+
9+
### 题目描述
10+
11+
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
12+
13+
**示例 1:**
14+
15+
```
16+
输入: [1,2,3,4,5,6,7] 和 k = 3
17+
输出: [5,6,7,1,2,3,4]
18+
解释:
19+
向右旋转 1 步: [7,1,2,3,4,5,6]
20+
向右旋转 2 步: [6,7,1,2,3,4,5]
21+
向右旋转 3 步: [5,6,7,1,2,3,4]
22+
```
23+
24+
**示例 2:**
25+
26+
```
27+
输入: [-1,-100,3,99] 和 k = 2
28+
输出: [3,99,-1,-100]
29+
解释:
30+
向右旋转 1 步: [99,-1,-100,3]
31+
向右旋转 2 步: [3,99,-1,-100]
32+
```
33+
34+
**说明:**
35+
36+
* 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
37+
* 要求使用空间复杂度为 O(1) 的 原地 算法。
38+
39+
<br>
40+
41+
### 题目解析
42+
43+
如果没有空间复杂度为 `O(1)` 这个限制,这道题相对来说会简单很多,需要做的仅仅复制一份数组,然后将 `[n - k, n]` 区间上的元素覆盖在数组的开头,接着遍历并覆盖剩下的元素即可。
44+
45+
不能使用额外的空间意味着你只能从数组本身来入手,这里我们可以使用反转数组来解决这道题,这是一个 rotate 数组的小技巧。如果仔细观察,你会发现 **数组经过 rotate 后会变成两个连续的区间段**,这两个区间段中的元素顺序和 rotate 之前的顺序是一样的。首先我们对数组当中所有的元素进行反转,然后分别对这两个区间进行反转,这样就可以保证区间内的顺序和之前一样,你可以看看动图或者自己动手尝试一下,这里并没有复杂的知识点,只是数组操作上的小技巧,了解了之后,可以运用到其他 rotate 数组的场景中。
46+
47+
<br>
48+
49+
### 代码实现
50+
51+
```java
52+
class Solution {
53+
public void rotate(int[] nums, int k) {
54+
if (nums.length < k) {
55+
k %= nums.length;
56+
}
57+
58+
reverse(nums, 0, nums.length - 1);
59+
reverse(nums, 0, k - 1);
60+
reverse(nums, k, nums.length - 1);
61+
}
62+
63+
public void reverse(int[] nums, int start, int end) {
64+
while (start < end) {
65+
int tmp = nums[start];
66+
nums[start] = nums[end];
67+
nums[end] = tmp;
68+
}
69+
}
70+
}
71+
```
72+
73+
<br>
74+
75+
### 动画描述
76+
77+
![](../Animation/189.gif)
78+
79+
<br>
80+
81+
### 复杂度分析
82+
83+
空间:O(1)
84+
85+
时间:O(n)
86+
87+
88+
![](../../Pictures/qrcode.jpg)
89+
90+
91+
92+
93+
94+
95+

Diff for: 0242-Valid-Anagram/Animation/242.gif

2.52 MB
Loading

Diff for: 0242-Valid-Anagram/Animation/242.m4v

2.02 MB
Binary file not shown.

Diff for: 0242-Valid-Anagram/Article/0242-Valid-Anagram.md

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# LeetCode 第 242 号问题:有效的字母异位词
2+
3+
> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
4+
>
5+
> 同步博客:https://www.algomooc.com
6+
7+
题目来源于 LeetCode 上第 242 号问题:有效的字母异位词。题目难度为 Easy,目前通过率为 60.5% 。
8+
9+
### 题目描述
10+
11+
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
12+
13+
**示例 1:**
14+
15+
```
16+
输入: s = "anagram", t = "nagaram"
17+
输出: true
18+
```
19+
20+
**示例 2:**
21+
22+
```
23+
输入: s = "rat", t = "car"
24+
输出: false
25+
```
26+
27+
**说明:**
28+
29+
你可以假设字符串只包含小写字母。
30+
31+
**进阶:**
32+
33+
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
34+
35+
### 题目解析
36+
37+
字母异位词的意思是,如果两个字符串互为字母异位词,那么两个字符串里的字符数量和种类都一样,不一样的是每个字符出现的位置,以及先后顺序。最简单的方法是直接将字符串按一定的规则排序,然后遍历对比即可。这种方法省空间,但是因为涉及到排序,时间复杂度就是 `O(nlgn)`
38+
39+
还有一个类似计数排序的方法,就是统计一个字符串里面所有字符对应的个数,然后再拿另外一个字符串做对比,这么做可以把时间复杂度降到 `O(n)`,如果这道题目中的字符串仅仅包含小写字母的话,我们可以开辟一个长度是 26 的数组,这样就不需要额外的空间,但如果说输入的字符串包含 unicode 字符,由于 unicode 字符集过于庞大,常量级别的数组变得不那么可取,我们可以考虑使用散列表这样的结构进行存储,逻辑是和之前一样的,但是这里的空间复杂度就不再是 `O(1)`,而是 `O(n)`
40+
41+
<br>
42+
43+
### 代码实现(排序)
44+
45+
```java
46+
public boolean isAnagram(String s, String t) {
47+
if ((s == null) || (t == null) || (t.length() != s.length())) {
48+
return false;
49+
}
50+
char[] sArr1 = s.toCharArray();
51+
char[] sArr2 = t.toCharArray();
52+
Arrays.sort(sArr1);
53+
Arrays.sort(sArr2);
54+
return Arrays.equals(sArr1, sArr2);
55+
}
56+
```
57+
58+
### 代码实现(哈希)
59+
60+
```java
61+
public boolean isAnagram(String s, String t) {
62+
if ((s == null) || (t == null) || (t.length() != s.length())) {
63+
return false;
64+
}
65+
66+
int n = s.length();
67+
68+
Map<Character, Integer> counts = new HashMap<>();
69+
70+
for (int i = 0; i < n; ++i) {
71+
counts.put(s.charAt(i), counts.getOrDefault(s.charAt(i), 0) + 1);
72+
}
73+
74+
for (int i = 0; i < n; ++i) {
75+
counts.put(t.charAt(i), counts.getOrDefault(t.charAt(i), 0) - 1);
76+
if (counts.getOrDefault(t.charAt(i), -1) < 0) {
77+
return false;
78+
}
79+
}
80+
81+
return true;
82+
}
83+
```
84+
85+
### 动画描述
86+
87+
![](../Animation/242.gif)
88+
89+
90+
![](../../Pictures/qrcode.jpg)

0 commit comments

Comments
 (0)