1- ### 数组
2- #### 什么是数组
1+ ## 数组
32
4- & emsp ;& emsp ; 我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储。
3+ ### 什么是数组
54
6-   数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择 。
5+ 我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储 。
76
8- & emsp ;& emsp ; 最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率 。
7+ 数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择 。
98
10- #### 类别
9+ 最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率。
10+
11+ ### 类别
1112- 1.无序数组
1213 - 概念:未经过排序的数组
1314 - 优点:插入快
3132### 题型总结
3233【一维数组】
3334#### 1.K-Sum
34- & emsp ;& emsp ; 这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
35+ 这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
3536- 暴力解法:最常见,但是通常会超时,只能作为备选,
3637- hash-map:建立一个hash-map循环遍历一次即可
3738- two-pointers:定位两个指针根绝和的大小来移动另外一个。这里设定的指针个数根据题目中K的个数来定。3Sum中可以设定3个指针,固定两个,移动另一个
3839
3940
4041#### 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/ )
4548- 题目理解:给定一个数组,包含每个会议的开始时间和结束时间[[ s1,e1] ,[ s2,e2] ,...] (si < ei),判断一个人能否参加所有的会议
4649- test case:
4750> Example1:
@@ -96,7 +99,7 @@ class Solution(object):
9699
97100- code:
98101Java解法
99- ```
102+ ``` java
100103class Solution {
101104 public int minSubArrayLen (int s , int [] nums ) {
102105 int res = Integer . MAX_VALUE ;// 因为是求min,所以设定是Max_VALUE,然后最后的res比较就行,注意res不是0
@@ -111,7 +114,7 @@ class Solution {
111114 return res == Integer . MAX_VALUE? 0 : res;
112115```
113116Python 解法
114- ```
117+ ```python
115118class Solution :
116119
117120def minSubArrayLen(self, s, nums):
@@ -126,8 +129,20 @@ def minSubArrayLen(self, s, nums):
126129 return result if result <= len(nums) else 0
127130```
128131
129- 【二维数组】
130- #### 4.Rotate题型
132+
133+
134+ ### 二维数组
135+
136+ #### Rotate题型
137+
138+
139+
140+
141+
142+
143+
144+
145+
131146
132147
133148
0 commit comments