Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 296392f

Browse files
Merge pull request MisterBooo#100 from peteryuhang/master
Solve problem 0189 & 0242
2 parents e093775 + cae5572 commit 296392f

File tree

6 files changed

+185
-0
lines changed

6 files changed

+185
-0
lines changed

‎0189-Rotate-Array/Animation/189.gif‎

1.37 MB
Loading[フレーム]

‎0189-Rotate-Array/Animation/189.m4v‎

924 KB
Binary file not shown.
Lines changed: 95 additions & 0 deletions
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+

‎0242-Valid-Anagram/Animation/242.gif‎

2.52 MB
Loading[フレーム]

‎0242-Valid-Anagram/Animation/242.m4v‎

2.02 MB
Binary file not shown.
Lines changed: 90 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /