1
- ### 数组
2
- #### 什么是数组
1
+ ## 数组
3
2
4
- & emsp ;& emsp ; 我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储。
3
+ ### 什么是数组
5
4
6
-   数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择 。
5
+ 我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储 。
7
6
8
- & emsp ;& emsp ; 最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率 。
7
+ 数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择 。
9
8
10
- #### 类别
9
+ 最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率。
10
+
11
+ ### 类别
11
12
- 1.无序数组
12
13
- 概念:未经过排序的数组
13
14
- 优点:插入快
31
32
### 题型总结
32
33
【一维数组】
33
34
#### 1.K-Sum
34
- & emsp ;& emsp ; 这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
35
+ 这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
35
36
- 暴力解法:最常见,但是通常会超时,只能作为备选,
36
37
- hash-map:建立一个hash-map循环遍历一次即可
37
38
- two-pointers:定位两个指针根绝和的大小来移动另外一个。这里设定的指针个数根据题目中K的个数来定。3Sum中可以设定3个指针,固定两个,移动另一个
38
39
39
40
40
41
#### 2.区间问题
41
- &emsp ;&emsp ; 这类题目通常会给一个包含多个子数组的数组,然后针对区间是否重合来判断true or false。解题技巧:
42
- 1. 按start排序
43
- 2. 在前一个区间的end和后一个区间的start找交集
44
- - 例题:252 meeting room[ easy] (https://leetcode.com/problems/meeting-rooms/)
42
+ 这类题目通常会给一个包含多个子数组的数组,然后针对区间是否重合来判断true or false。解题技巧:
43
+
44
+ > 1 . 按start排序
45
+ > 2 . 在前一个区间的end和后一个区间的start找交集
46
+
47
+ - 例题: [ 252 meeting room] ( https://leetcode.com/problems/meeting-rooms/ )
45
48
- 题目理解:给定一个数组,包含每个会议的开始时间和结束时间[[ s1,e1] ,[ s2,e2] ,...] (si < ei),判断一个人能否参加所有的会议
46
49
- test case:
47
50
> Example1:
@@ -96,7 +99,7 @@ class Solution(object):
96
99

97
100
- code:
98
101
Java解法
99
- ```
102
+ ``` java
100
103
class Solution {
101
104
public int minSubArrayLen (int s , int [] nums ) {
102
105
int res = Integer . MAX_VALUE ;// 因为是求min,所以设定是Max_VALUE,然后最后的res比较就行,注意res不是0
@@ -111,7 +114,7 @@ class Solution {
111
114
return res == Integer . MAX_VALUE? 0 : res;
112
115
```
113
116
Python 解法
114
- ```
117
+ ```python
115
118
class Solution :
116
119
117
120
def minSubArrayLen(self, s, nums):
@@ -126,8 +129,20 @@ def minSubArrayLen(self, s, nums):
126
129
return result if result <= len(nums) else 0
127
130
```
128
131
129
- 【二维数组】
130
- #### 4.Rotate题型
132
+
133
+
134
+ ### 二维数组
135
+
136
+ #### Rotate题型
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
131
146
132
147
133
148
0 commit comments