Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
wwwanlingxiao
LeetCodeAnimation
Commits
cae55728
You need to sign in or sign up before continuing.
Commit
cae55728
authored
May 31, 2020
by
Yuhang Peng
Browse files
Solve problem 0189 & 0242
parent
e0937750
Changes
6
Hide whitespace changes
Inline
Side-by-side
0189-Rotate-Array/Animation/189.gif
0 → 100644
View file @
cae55728
1.37 MB
0189-Rotate-Array/Animation/189.m4v
0 → 100644
View file @
cae55728
File added
0189-Rotate-Array/Article/0189-Rotate-Array.md
0 → 100644
View file @
cae55728
# LeetCode第 189 号问题:旋转数组
> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
>
> 同步博客:https://www.algomooc.com
题目来源于 LeetCode 上第 189 号问题:旋转数组。题目难度为 Easy,目前通过率为 41.7% 。
### 题目描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
**示例 1:**
```
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
```
**示例 2:**
```
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
```
**说明:**
*
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
*
要求使用空间复杂度为 O(1) 的 原地 算法。
<br>
### 题目解析
如果没有空间复杂度为
`O(1)`
这个限制,这道题相对来说会简单很多,需要做的仅仅复制一份数组,然后将
`[n - k, n]`
区间上的元素覆盖在数组的开头,接着遍历并覆盖剩下的元素即可。
不能使用额外的空间意味着你只能从数组本身来入手,这里我们可以使用反转数组来解决这道题,这是一个 rotate 数组的小技巧。如果仔细观察,你会发现
**数组经过 rotate 后会变成两个连续的区间段**
,这两个区间段中的元素顺序和 rotate 之前的顺序是一样的。首先我们对数组当中所有的元素进行反转,然后分别对这两个区间进行反转,这样就可以保证区间内的顺序和之前一样,你可以看看动图或者自己动手尝试一下,这里并没有复杂的知识点,只是数组操作上的小技巧,了解了之后,可以运用到其他 rotate 数组的场景中。
<br>
### 代码实现
```
java
class
Solution
{
public
void
rotate
(
int
[]
nums
,
int
k
)
{
if
(
nums
.
length
<
k
)
{
k
%=
nums
.
length
;
}
reverse
(
nums
,
0
,
nums
.
length
-
1
);
reverse
(
nums
,
0
,
k
-
1
);
reverse
(
nums
,
k
,
nums
.
length
-
1
);
}
public
void
reverse
(
int
[]
nums
,
int
start
,
int
end
)
{
while
(
start
<
end
)
{
int
tmp
=
nums
[
start
];
nums
[
start
]
=
nums
[
end
];
nums
[
end
]
=
tmp
;
}
}
}
```
<br>
### 动画描述

<br>
### 复杂度分析
空间:O(1)
时间:O(n)

0242-Valid-Anagram/Animation/242.gif
0 → 100644
View file @
cae55728
2.52 MB
0242-Valid-Anagram/Animation/242.m4v
0 → 100644
View file @
cae55728
File added
0242-Valid-Anagram/Article/0242-Valid-Anagram.md
0 → 100644
View file @
cae55728
# LeetCode 第 242 号问题:有效的字母异位词
> 本文首发于公众号「图解面试算法」,是 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
>
> 同步博客:https://www.algomooc.com
题目来源于 LeetCode 上第 242 号问题:有效的字母异位词。题目难度为 Easy,目前通过率为 60.5% 。
### 题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
**示例 1:**
```
输入: s = "anagram", t = "nagaram"
输出: true
```
**示例 2:**
```
输入: s = "rat", t = "car"
输出: false
```
**说明:**
你可以假设字符串只包含小写字母。
**进阶:**
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
### 题目解析
字母异位词的意思是,如果两个字符串互为字母异位词,那么两个字符串里的字符数量和种类都一样,不一样的是每个字符出现的位置,以及先后顺序。最简单的方法是直接将字符串按一定的规则排序,然后遍历对比即可。这种方法省空间,但是因为涉及到排序,时间复杂度就是
`O(nlgn)`
。
还有一个类似计数排序的方法,就是统计一个字符串里面所有字符对应的个数,然后再拿另外一个字符串做对比,这么做可以把时间复杂度降到
`O(n)`
,如果这道题目中的字符串仅仅包含小写字母的话,我们可以开辟一个长度是 26 的数组,这样就不需要额外的空间,但如果说输入的字符串包含 unicode 字符,由于 unicode 字符集过于庞大,常量级别的数组变得不那么可取,我们可以考虑使用散列表这样的结构进行存储,逻辑是和之前一样的,但是这里的空间复杂度就不再是
`O(1)`
,而是
`O(n)`
<br>
### 代码实现(排序)
```
java
public
boolean
isAnagram
(
String
s
,
String
t
)
{
if
((
s
==
null
)
||
(
t
==
null
)
||
(
t
.
length
()
!=
s
.
length
()))
{
return
false
;
}
char
[]
sArr1
=
s
.
toCharArray
();
char
[]
sArr2
=
t
.
toCharArray
();
Arrays
.
sort
(
sArr1
);
Arrays
.
sort
(
sArr2
);
return
Arrays
.
equals
(
sArr1
,
sArr2
);
}
```
### 代码实现(哈希)
```
java
public
boolean
isAnagram
(
String
s
,
String
t
)
{
if
((
s
==
null
)
||
(
t
==
null
)
||
(
t
.
length
()
!=
s
.
length
()))
{
return
false
;
}
int
n
=
s
.
length
();
Map
<
Character
,
Integer
>
counts
=
new
HashMap
<>();
for
(
int
i
=
0
;
i
<
n
;
++
i
)
{
counts
.
put
(
s
.
charAt
(
i
),
counts
.
getOrDefault
(
s
.
charAt
(
i
),
0
)
+
1
);
}
for
(
int
i
=
0
;
i
<
n
;
++
i
)
{
counts
.
put
(
t
.
charAt
(
i
),
counts
.
getOrDefault
(
t
.
charAt
(
i
),
0
)
-
1
);
if
(
counts
.
getOrDefault
(
t
.
charAt
(
i
),
-
1
)
<
0
)
{
return
false
;
}
}
return
true
;
}
```
### 动画描述


\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment