Skip to content

Commit 6615c88

Browse files
authored
Merge pull request doocs#39 from KongJHong/master
daily code
2 parents d435b1e + 316ab91 commit 6615c88

File tree

4 files changed

+211
-1
lines changed

4 files changed

+211
-1
lines changed

solution/002.Add Two Numbers/README.md

+42-1
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,45 @@ class Solution {
9898
return res.next;
9999
}
100100
}
101-
```
101+
```
102+
#### CPP
103+
```CPP
104+
class Solution {
105+
public:
106+
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
107+
108+
ListNode *ans_l = new ListNode(0);
109+
ListNode *head = ans_l;
110+
int tmp = 0;
111+
while(l1 != NULL && l2 != NULL){
112+
tmp += l1->val + l2->val;
113+
ans_l->next = new ListNode(tmp % 10);
114+
tmp = tmp / 10;
115+
ans_l = ans_l->next;
116+
l1 = l1->next;
117+
l2 = l2->next;
118+
}
119+
120+
while(l1 != NULL){
121+
tmp += l1->val;
122+
ans_l->next = new ListNode(tmp % 10);
123+
tmp = tmp / 10;
124+
ans_l = ans_l->next;
125+
l1 = l1->next;
126+
}
127+
128+
while(l2 != NULL){
129+
tmp += l2->val;
130+
ans_l->next = new ListNode(tmp % 10);
131+
tmp = tmp / 10;
132+
ans_l = ans_l->next;
133+
l2 = l2->next;
134+
}
135+
136+
if(tmp)ans_l->next = new ListNode(tmp);
137+
138+
return head->next;
139+
}
140+
};
141+
142+
```
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution {
2+
public:
3+
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
4+
5+
ListNode *ans_l = new ListNode(0);
6+
ListNode *head = ans_l;
7+
int tmp = 0;
8+
while(l1 != NULL && l2 != NULL){
9+
tmp += l1->val + l2->val;
10+
ans_l->next = new ListNode(tmp % 10);
11+
tmp = tmp / 10;
12+
ans_l = ans_l->next;
13+
l1 = l1->next;
14+
l2 = l2->next;
15+
}
16+
17+
while(l1 != NULL){
18+
tmp += l1->val;
19+
ans_l->next = new ListNode(tmp % 10);
20+
tmp = tmp / 10;
21+
ans_l = ans_l->next;
22+
l1 = l1->next;
23+
}
24+
25+
while(l2 != NULL){
26+
tmp += l2->val;
27+
ans_l->next = new ListNode(tmp % 10);
28+
tmp = tmp / 10;
29+
ans_l = ans_l->next;
30+
l2 = l2->next;
31+
}
32+
33+
if(tmp)ans_l->next = new ListNode(tmp);
34+
35+
return head->next;
36+
}
37+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
## 搜索旋转排序数组
2+
### 题目描述
3+
4+
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
5+
6+
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
7+
8+
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
9+
10+
你可以假设数组中不存在重复的元素。
11+
12+
你的算法时间复杂度必须是 O(log n) 级别。
13+
14+
```
15+
示例 1:
16+
输入: nums = [4,5,6,7,0,1,2], target = 0
17+
输出: 4
18+
```
19+
20+
```
21+
示例 2:
22+
输入: nums = [4,5,6,7,0,1,2], target = 3
23+
输出: -1
24+
```
25+
26+
27+
----------------------
28+
### 思路:
29+
因为是排序数组,而且要求是log2(n)时间搜索,所以优先选择用二分搜索法,但是这道题的难点就是不知道原数组的旋转位置在哪里,无法从中间值对比过程中直接进行二分搜索
30+
31+
我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法:
32+
33+
0  1  2   4  5  6  7
34+
35+
7  0  1   **2  4  5  6**
36+
37+
6  7  0   **1  2  4  5**
38+
39+
5  6  7   **0  1  2  4**
40+
41+
**4  5  6  7**  0  1  2
42+
43+
**2  4  5  6**  7  0  1
44+
45+
**1  2  4  5**  6  7  0
46+
47+
二分搜索法的关键点在于,在与中间值进行对比后,大于则在右半部分搜索,小于则在左半部分搜索,反复进行达到收敛。
48+
49+
我们观察上面加粗的部分,如果:
50+
中间值比最右值小,则右半部有序递增
51+
中间值比最右值大,则左半部有序递增
52+
53+
通过这个特点,对该数组进行二分搜索
54+
55+
```C++
56+
class Solution {
57+
public:
58+
int search(vector<int>& nums, int target) {
59+
int len = nums.size();
60+
int left = 0;
61+
int right = len - 1;
62+
int mid;
63+
while(left <= right) {
64+
mid = (left + right) / 2;
65+
if(nums[mid] == target)return mid;
66+
67+
if(nums[mid] < nums[right]) {
68+
if(nums[right] >= target && nums[mid] < target)left = mid + 1;
69+
else right = mid - 1;
70+
}
71+
else {
72+
if(nums[left] <= target && nums[mid] > target)right = mid - 1;
73+
else left = mid + 1;
74+
}
75+
}
76+
return -1;
77+
}
78+
};
79+
80+
```
81+
-------------------------
82+
我发现其实这种暴力枚举,时间差不了多少,各位赶时间就直接暴力吧!!!
83+
84+
```C++
85+
class Solution {
86+
public:
87+
int search(vector<int>& nums, int target) {
88+
int len = nums.size();
89+
for(int i = 0;i<len;i++) {
90+
if(target == nums[i])return i;
91+
}
92+
93+
return -1;
94+
}
95+
};
96+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public:
3+
int search(vector<int>& nums, int target) {
4+
int len = nums.size();
5+
int left = 0;
6+
int right = len - 1;
7+
int mid;
8+
while(left <= right) {
9+
mid = (left + right) / 2;
10+
if(nums[mid] == target)return mid;
11+
12+
if(nums[mid] < nums[right]) {
13+
if(nums[right] >= target && nums[mid] < target)left = mid + 1;
14+
else right = mid - 1;
15+
}
16+
else {
17+
if(nums[left] <= target && nums[mid] > target)right = mid - 1;
18+
else left = mid + 1;
19+
}
20+
}
21+
return -1;
22+
}
23+
};
24+
25+
---------------
26+
class Solution {
27+
public:
28+
int search(vector<int>& nums, int target) {
29+
int len = nums.size();
30+
for(int i = 0;i<len;i++) {
31+
if(target == nums[i])return i;
32+
}
33+
34+
return -1;
35+
}
36+
};

0 commit comments

Comments
 (0)