Skip to content

Commit 62cb50b

Browse files
authored
Merge pull request #61 from KongJHong/master
Add Solution 035[CPP]
2 parents b122d2a + 44bba29 commit 62cb50b

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed

solution/035.Search Insert Position/README.md

+85
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
除此之外还可用二分法做解。
4040

41+
4142
```java
4243
class Solution {
4344
public int searchInsert(int[] nums, int target) {
@@ -90,3 +91,87 @@ class Solution {
9091
}
9192
}
9293
```
94+
95+
#### CPP
96+
97+
思路1:
98+
99+
1. 先调函数查找是否存在target元素
100+
2. 若存在,用二分法进行查找,或者顺序遍历
101+
3. 若不存在,则顺序遍历插入
102+
103+
时间复杂度O(log2(n))~O(n)
104+
105+
思路2:
106+
1. 直接顺序遍历---需要点取巧,下标比nums长度小,nums[p]元素要比targat小
107+
108+
时间复杂度O(n)
109+
110+
```CPP
111+
class Solution {
112+
public:
113+
int searchInsert(vector<int>& nums, int target) {
114+
int len = nums.size();
115+
if(len == 0){
116+
nums.push_back(target);
117+
return 0;
118+
}
119+
120+
auto iter = find(nums.begin(),nums.end(),target);
121+
122+
if(iter != nums.end()){
123+
return binarySearch(nums,0,len - 1,target);
124+
}
125+
else{
126+
int slow = 0;
127+
int fast = 1;
128+
129+
if(nums[0] >= target)return 0;
130+
if(nums[len-1] <= target)return len;
131+
132+
while(fast < len){
133+
if(nums[slow] <= target && nums[fast] > target){
134+
nums.insert(nums.begin() + fast,target);
135+
return fast;
136+
}
137+
else{
138+
slow++;
139+
fast++;
140+
}
141+
}
142+
return fast;
143+
}
144+
}
145+
146+
147+
int binarySearch(vector<int> &nums,int left,int right,int target){
148+
if(nums[left] == target)return left;
149+
if(nums[right] == target)return right;
150+
151+
int mid = (left + right) / 2;
152+
153+
if(nums[mid] > target)return binarySearch(nums,left+1,mid,target);
154+
else if(nums[mid] < target)return binarySearch(nums,mid,right-1,target);
155+
else return mid;
156+
}
157+
158+
};
159+
160+
-------------------------
161+
class Solution {
162+
public:
163+
int searchInsert(vector<int>& nums, int target) {
164+
if (nums.size() == 0) {
165+
nums.push_back(target);
166+
return 0;
167+
}
168+
unsigned int i = 0;
169+
170+
while(i<nums.size()&&nums[i]<target)i++;
171+
172+
nums.insert(nums.begin() + i, target);
173+
return i;
174+
}
175+
};
176+
177+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
class Solution {
2+
public:
3+
int searchInsert(vector<int>& nums, int target) {
4+
int len = nums.size();
5+
if(len == 0){
6+
nums.push_back(target);
7+
return 0;
8+
}
9+
10+
auto iter = find(nums.begin(),nums.end(),target);
11+
12+
if(iter != nums.end()){
13+
return binarySearch(nums,0,len - 1,target);
14+
}
15+
else{
16+
int slow = 0;
17+
int fast = 1;
18+
19+
if(nums[0] >= target)return 0;
20+
if(nums[len-1] <= target)return len;
21+
22+
while(fast < len){
23+
if(nums[slow] <= target && nums[fast] > target){
24+
nums.insert(nums.begin() + fast,target);
25+
return fast;
26+
}
27+
else{
28+
slow++;
29+
fast++;
30+
}
31+
}
32+
return fast;
33+
}
34+
}
35+
36+
37+
int binarySearch(vector<int> &nums,int left,int right,int target){
38+
if(nums[left] == target)return left;
39+
if(nums[right] == target)return right;
40+
41+
int mid = (left + right) / 2;
42+
43+
if(nums[mid] > target)return binarySearch(nums,left+1,mid,target);
44+
else if(nums[mid] < target)return binarySearch(nums,mid,right-1,target);
45+
else return mid;
46+
}
47+
48+
};
49+
50+
-------------------------
51+
class Solution {
52+
public:
53+
int searchInsert(vector<int>& nums, int target) {
54+
if (nums.size() == 0) {
55+
nums.push_back(target);
56+
return 0;
57+
}
58+
unsigned int i = 0;
59+
60+
while(i<nums.size()&&nums[i]<target)i++;
61+
62+
nums.insert(nums.begin() + i, target);
63+
return i;
64+
}
65+
};

0 commit comments

Comments
 (0)