Skip to content

Commit 053706e

Browse files
committed
add array
1 parent 36e3a5b commit 053706e

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

Array/K-SUM/1-TwoSum.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution(object):
2+
def twoSum(self, nums, target):
3+
"""
4+
:type nums: List[int]
5+
:type target: int
6+
:rtype: List[int]
7+
"""
8+
keys = {}
9+
for i in xrange(len(nums)):
10+
if target - nums[i] in keys:
11+
return [keys[target - nums[i]], i]
12+
if nums[i] not in keys:
13+
keys[nums[i]] = i

array.md renamed to Array/array.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
### 数组
22
- 什么是数组
3-
我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储。
3+
  我们知道常用的数据存储方式有两种:顺序存储和非顺序存储。顺序存储就是把数据存储在一块连续的空间内。数组(array)就是典型的顺序存储,而链表就是典型的非顺序存储。
44

5-
数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择。
5+
  数组通常用于存储一系列相同类型的数据。当我们在创建数组时,会在内存中划分出一块连续的内存用于存储数据,插入数据时,会将数据按顺序存储在这块连续的内存中,读取时通过访问数组的索引迅速取出。数组名就是一个指针,指向这段内存的起始地址。通过数组的类型,编译器知道在访问下一个元素的时候需要在内存中后移多少个字节。由于数组在存储时是顺序存储的,存储数据的内存也是连续的,所以数组在读取数据时比较容易,随机访问速度快,但是插入和删除就比较费劲了。读取可以直接根据索引,插入和删除则比较耗时,插一个数据需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中,如果想删除一个元素,同样需要移动大量元素去掉被移动的元素。所以如果需求是快速访问数据,很少或者几乎不插入和删除元素,数组是一个不错的选择。
6+
7+
  最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率。
68

7-
最常见的有一维数组和二维数组,稍微复杂一点的是多维数组和动态数组。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,对于Python而言,内置的List就是一个动态指针数组。当列表中没有空间存储新的元素时,列表会动态地改变大小以容纳新的元素,每次改变大小时,会预留一部分空间以降低改变大小的频率。
89
- 类别
9-
1.无序数组
10+
1.无序数组
1011
- 概念:未经过排序的数组
1112
- 优点:插入快
1213
- 缺点:查找慢,删除慢,大小固定
@@ -25,15 +26,16 @@
2526
- 根绝数据量判断:数据量小且可预知,查询速度比插入速度更重要使用有序数组;数据量大且不可知,插入速度比查询速度更重要使用无序数组。
2627

2728
### 题型总结
29+
【一维数组】
2830
#### 1.K-Sum
29-
这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
31+
  这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
3032
- 暴力解法:最常见,但是通常会超时,只能作为备选,
3133
- hash-map:建立一个hash-map循环遍历一次即可
3234
- two-pointers:定位两个指针根绝和的大小来移动另外一个。这里设定的指针个数根据题目中K的个数来定。3Sum中可以设定3个指针,固定两个,移动另一个
3335

3436

3537
#### 2.区间问题
36-
这类题目通常会给一个包含多个子数组的数组,然后针对区间是否重合来判断true or false。解题技巧:
38+
  这类题目通常会给一个包含多个子数组的数组,然后针对区间是否重合来判断true or false。解题技巧:
3739
1. 按start排序
3840
2. 在前一个区间的end和后一个区间的start找交集
3941
- 例题:252 meeting room[easy]https://leetcode.com/problems/meeting-rooms/)
@@ -42,8 +44,8 @@
4244
>Example1:
4345
>Input: [[0,30],[5,10],[15,20]]
4446
>Output: false
45-
> Example2:
46-
> Input: [[7,10],[2,4]]
47+
>Example2:
48+
>Input: [[7,10],[2,4]]
4749
>Output: true
4850
4951
- 解题思路:在这个题目里,如果一个人要参加所有会议,那么所有会议的时间应该不能重合,所以只需要判断后一个会议开始的start > 前一个会议结束的end就就可以,如果end>start,就返回false。首先得先对所有子数组的start进行排序,然后再进行判断start和end
@@ -78,15 +80,15 @@ class Solution(object):
7880
```
7981

8082
#### 子数组类题目
81-
这类题目通常会在一个包含多个子数组的数组中,求和/积,最大最小等。形式有很多种,例如求一个数组中和最小的子数组(209题),或者积最小的子数组(238题)
83+
  这类题目通常会在一个包含多个子数组的数组中,求和/积,最大最小等。形式有很多种,例如求一个数组中和最小的子数组(209题),或者积最小的子数组(238题)
8284
- 解题技巧:
8385
- 滑动窗口(sliding window)
8486
- 例题:209 Minimum Size Subarray Sum[Medium]
8587
- 题目理解:给定我们一个数字,让我们求子数组之和大于等于给定值的最小长度
8688
- test case:
87-
Input: s = 7, nums = [2,3,1,2,4,3]
88-
Output: 2
89-
Explanation: the subarray [4,3] has the minimal length under the problem constraint.
89+
>Input: s = 7, nums = [2,3,1,2,4,3]
90+
>Output: 2
91+
>解释:满足子数组和=7的最小长度数组是[4,3],所以output=2
9092
- 解题思路:求的数字要大于等于这个数字target,譬如这个testcase中,[2,3,1,2,4,3],从前往后相加,前四项相加的和为8.已经大于7了,但是我们的target是7,后面的几项也都是正整数,继续往后走,肯定也会大于target7,所以这个时候我们把left指针往右移动一位,那么就是相当于成为了一个滑动窗口(sliding window),这种方法在String类型的题目出现的更多。
9193
9294
- code:
@@ -121,4 +123,8 @@ def minSubArrayLen(self, s, nums):
121123
return result if result <= len(nums) else 0
122124
```
123125

126+
【二维数组】
127+
#### 4.Rotate题型
128+
129+
124130

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
------
1414
### LeetCode题目分类
15-
#### N-Sum 类题目
15+
#### K-Sum 类题目
1616
| 序号 | 题目 | 难度 |代码|
1717
| :------| :------ | :------ |:------ |
1818
| 1 | [Two Sum](https://leetcode.com/problems/two-sum/) | easy | python、java、c++|

0 commit comments

Comments
 (0)