Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
LeetCodeAnimation
提交
296392f3
L
LeetCodeAnimation
项目概览
wushizhenking
/
LeetCodeAnimation
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
LeetCodeAnimation
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
296392f3
编写于
6月 04, 2020
作者:
程
程序员吴师兄
提交者:
GitHub
6月 04, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #100 from peteryuhang/master
Solve problem 0189 & 0242
上级
e0937750
cae55728
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
185 addition
and
0 deletion
+185
-0
0189-Rotate-Array/Animation/189.gif
0189-Rotate-Array/Animation/189.gif
+0
-0
0189-Rotate-Array/Animation/189.m4v
0189-Rotate-Array/Animation/189.m4v
+0
-0
0189-Rotate-Array/Article/0189-Rotate-Array.md
0189-Rotate-Array/Article/0189-Rotate-Array.md
+95
-0
0242-Valid-Anagram/Animation/242.gif
0242-Valid-Anagram/Animation/242.gif
+0
-0
0242-Valid-Anagram/Animation/242.m4v
0242-Valid-Anagram/Animation/242.m4v
+0
-0
0242-Valid-Anagram/Article/0242-Valid-Anagram.md
0242-Valid-Anagram/Article/0242-Valid-Anagram.md
+90
-0
未找到文件。
0189-Rotate-Array/Animation/189.gif
0 → 100644
浏览文件 @
296392f3
1.4 MB
0189-Rotate-Array/Animation/189.m4v
0 → 100644
浏览文件 @
296392f3
文件已添加
0189-Rotate-Array/Article/0189-Rotate-Array.md
0 → 100644
浏览文件 @
296392f3
# 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>
### 动画描述
![](
../Animation/189.gif
)
<br>
### 复杂度分析
空间:O(1)
时间:O(n)
![](
../../Pictures/qrcode.jpg
)
0242-Valid-Anagram/Animation/242.gif
0 → 100644
浏览文件 @
296392f3
2.5 MB
0242-Valid-Anagram/Animation/242.m4v
0 → 100644
浏览文件 @
296392f3
文件已添加
0242-Valid-Anagram/Article/0242-Valid-Anagram.md
0 → 100644
浏览文件 @
296392f3
# 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
;
}
```
### 动画描述
![](
../Animation/242.gif
)
![](
../../Pictures/qrcode.jpg
)
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录