Skip to content

Commit 1fd7be0

Browse files
committedFeb 18, 2020
更新了102题 105题 106题 215题的代码
1 parent 3aaa9e6 commit 1fd7be0

File tree

7 files changed

+405
-0
lines changed

7 files changed

+405
-0
lines changed
 

‎cpp/102.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
import Queue
9+
10+
class Solution(object):
11+
def levelOrder(self, root):
12+
"""
13+
:type root: TreeNode
14+
:rtype: List[List[int]]
15+
"""
16+
q = Queue.Queue

‎cpp/105.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <vector>
2+
#include <algorithm>
3+
using std::find;
4+
using std::vector;
5+
6+
struct TreeNode {
7+
int val;
8+
TreeNode *left;
9+
TreeNode *right;
10+
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
11+
};
12+
/**
13+
* time: 20 ms
14+
* Memory: 22.3 MB
15+
*/
16+
17+
class Solution {
18+
public:
19+
TreeNode*
20+
buildTree(vector<int>& preorder, vector<int>& inorder) {
21+
if (preorder.size() != 0) {
22+
auto p_begin = preorder.begin();
23+
TreeNode* rs = pi2T(p_begin, inorder.begin(), inorder.end());
24+
return rs;
25+
}
26+
return nullptr;
27+
}
28+
29+
TreeNode*
30+
pi2T(vector<int>::const_iterator &p_begin, vector<int>::const_iterator i_begin, vector<int>::const_iterator i_end) {
31+
if (i_begin != i_end) {
32+
int val = *p_begin;
33+
p_begin++; // 向后走
34+
auto mid = find(i_begin, i_end, val);
35+
TreeNode* node = new TreeNode(val);
36+
node->left = pi2T(p_begin, i_begin, mid);
37+
node->right = pi2T(p_begin, mid+1, i_end);
38+
return node;
39+
}
40+
return nullptr;
41+
}
42+
};
43+

‎cpp/106.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <vector>
2+
#include <algorithm>
3+
using std::find;
4+
using std::vector;
5+
6+
struct TreeNode {
7+
int val;
8+
TreeNode *left;
9+
TreeNode *right;
10+
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
11+
};
12+
/**
13+
* time: 20 ms
14+
* Memory: 22.3 MB
15+
*/
16+
17+
class Solution {
18+
public:
19+
TreeNode*
20+
buildTree(vector<int>& inorder, vector<int>& postorder) {
21+
if (0 != inorder.size()) {
22+
auto p_rbegin = postorder.rbegin();
23+
TreeNode* rs = ip2T(p_rbegin, inorder.cbegin(), inorder.cend());
24+
return rs;
25+
}
26+
return nullptr;
27+
}
28+
29+
TreeNode*
30+
ip2T(vector<int>::reverse_iterator &p_rbegin, vector<int>::const_iterator i_begin, vector<int>::const_iterator i_end) {
31+
if (i_begin != i_end) {
32+
int val = *p_rbegin;
33+
p_rbegin++; // 向前
34+
auto mid = find(i_begin, i_end, val);
35+
TreeNode* node = new TreeNode(val);
36+
node->right = ip2T(p_rbegin, mid+1, i_end);
37+
node->left = ip2T(p_rbegin, i_begin, mid);
38+
return node;
39+
}
40+
return nullptr;
41+
}
42+
};
43+

‎cpp/215.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include <vector>
2+
#include <cstdio>
3+
#include <algorithm>
4+
using std::vector;
5+
using std::partition;
6+
using std::printf;
7+
8+
class Solution {
9+
public:
10+
int findKthLargest(vector<int>& nums, int k) {
11+
if (nums.size() == 1)
12+
return nums[0];
13+
int i = 0;
14+
int j = nums.size() - 1;
15+
int len = nums.size(); // 末尾
16+
// 题目不需要判断
17+
int p_index = -1;
18+
while (i <= j) {
19+
20+
int diff = len - p_index;
21+
if (diff > k) { // 偏前了
22+
i = p_index + 1; // 去后面找
23+
} else if (diff < k) {
24+
j = p_index - 1;
25+
} else { // 相等
26+
return nums[p_index];
27+
}
28+
p_index = partition(nums, i, j);
29+
}
30+
return 0;
31+
}
32+
int partition(vector<int>& nums, int begin, int end) {
33+
if (end == begin) {
34+
return begin;
35+
}
36+
int pivot = find_pivot_mid3(nums, begin, end);
37+
38+
printf("\n [");
39+
for (auto i : nums)
40+
printf("%d, ", i);
41+
printf("]\n");
42+
int i = begin;
43+
int j = end - 1;
44+
while(1) {
45+
while (i < j && nums[i] < pivot) i++;
46+
while (i < j && nums[j] >= pivot) j--;
47+
if (i < j) //如果满足则证明还没碰面
48+
swap(nums[i], nums[j]);
49+
else
50+
break;
51+
}
52+
swap(nums[i], nums[end-1]);
53+
printf("\n [");
54+
for (auto i : nums)
55+
printf("%d, ", i);
56+
printf("]\n");
57+
return i;
58+
}
59+
60+
int find_pivot_mid3(vector<int>& nums, int begin, int end) {
61+
int mid = (end - begin) / 2 + begin;
62+
if (nums[mid] < nums[begin])
63+
swap(nums[mid], nums[begin]);
64+
if (nums[end] < nums[mid])
65+
swap(nums[end], nums[mid]);
66+
if (nums[mid] < nums[begin])
67+
swap(nums[mid], nums[begin]);
68+
69+
swap(nums[mid], nums[end-1]);// 把中间值交换到后面
70+
return nums[end-1];
71+
}
72+
73+
74+
void swap(int& a, int& b) {
75+
int c = a;
76+
a = b;
77+
b = c;
78+
}
79+
80+
};
81+
82+
int main()
83+
{
84+
Solution s;
85+
vector<int> vec = {3,2,1,5,6,4};
86+
printf("->%d \n", s.findKthLargest(vec, 2));
87+
for (auto i : vec)
88+
printf("%d. \n", i);
89+
90+
}

‎cpp/215_2.cpp

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include <vector>
2+
#include <cstdio>
3+
#include <algorithm>
4+
#include <iterator>
5+
#include <iostream>
6+
using std::vector;
7+
using std::partition_point;
8+
using std::printf;
9+
10+
class Solution {
11+
public:
12+
int findKthLargest(vector<int>& nums, int k) {
13+
if (nums.size() == 1)
14+
return nums[0];
15+
auto i = nums.begin();
16+
auto j = nums.end();
17+
auto begin = nums.begin();
18+
auto end = nums.end();
19+
20+
// 题目不需要判断
21+
auto p_index = nums.begin() - 1;
22+
int mid_val = *i;
23+
int diff;
24+
25+
26+
while (i < j) {
27+
28+
diff = end - p_index;
29+
if (diff > k) { // 偏前了
30+
i = p_index + 1; // 去后面找
31+
} else if (diff < k) {
32+
j = p_index; // 容易出死循环
33+
} else { // 相等
34+
// printf("diff: %d", diff);
35+
// return 0;
36+
return *p_index;
37+
}
38+
// mid_val = mid(*i, *(j-1), *((j - i) / 2 + i) );
39+
int mid_val = *i;
40+
// printf("{mid=%d}: ", mid_val);
41+
// printf("i=%d----", *i);
42+
p_index = partition(i+1, j, [mid_val](int a){return a < mid_val;}); // 使用很麻烦
43+
p_index--;
44+
swap(*p_index, *i);
45+
// std::copy(begin, p_index, std::ostream_iterator<int>(std::cout, " "));
46+
// printf("*");
47+
// std::copy(p_index, end, std::ostream_iterator<int>(std::cout, " "));
48+
// printf(" p_index=%d", *p_index);
49+
// printf(" diff=%d\n", diff);
50+
51+
// printf("===mid_val: {%d} ===\n", mid_val);
52+
53+
// int debug;
54+
// std::cin >> debug;
55+
}
56+
return 0;
57+
}
58+
int mid(int a, int b, int c) {
59+
if (a > b)
60+
swap(a, b);
61+
if (b > c)
62+
swap(b, c);
63+
if (a > b)
64+
swap(a, b);
65+
return b;
66+
}
67+
void swap(int& a, int& b) {
68+
int c = a;
69+
a = b;
70+
b = c;
71+
}
72+
73+
};
74+
75+
int main()
76+
{
77+
Solution s;
78+
// vector<int> vec1 = {3,2,3,1,2,4,5,5,6};
79+
// printf("->%d \n", s.findKthLargest(vec1, 4));
80+
// vector<int> vec2 = {3,2,1,5,6,4};
81+
// printf("->%d \n", s.findKthLargest(vec2, 2));
82+
vector<int> vec3 = {2, 1};
83+
printf("->%d \n", s.findKthLargest(vec3, 2));
84+
// for (auto i : vec)
85+
// printf("%d. \n", i);
86+
87+
88+
}

‎python/1.py

+80
Large diffs are not rendered by default.

‎python/215.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
class Solution:
2+
"""
3+
1040 ms 14.71%
4+
13.1 MB 100%
5+
"""
6+
def findKthLargest(self, nums, k):
7+
i = 0
8+
length = len(nums)
9+
j = length - 1
10+
pivot = -1
11+
while i < j:
12+
print(nums, i, j, pivot)
13+
diff = length - pivot
14+
if diff > k:
15+
i = pivot + 1
16+
elif diff < k:
17+
j = pivot - 1
18+
else:
19+
return nums[pivot]
20+
pivot = self.partition(nums, i, j)
21+
return nums[i]
22+
23+
def partition(self, nums, i, j):
24+
if i == j:
25+
return i
26+
pivot = nums[i]
27+
l = i + 1
28+
r = j
29+
while 1:
30+
while l <= r and nums[l] < pivot:
31+
l += 1
32+
while l <= r and nums[r] >= pivot:
33+
r -= 1
34+
if l <= r:
35+
nums[l], nums[r] = nums[r], nums[l]
36+
else:
37+
break
38+
39+
nums[r], nums[i] = nums[i], nums[r]
40+
return r
41+
42+
s = Solution()
43+
print(s.findKthLargest([3,2,1,5,6,4], 2))
44+
45+

0 commit comments

Comments
 (0)
Please sign in to comment.