Skip to content

Commit d2f7c35

Browse files
committed
常规提交
1 parent 590f984 commit d2f7c35

File tree

18 files changed

+574
-0
lines changed

18 files changed

+574
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
int maxProfit(vector<int>& prices) {
4+
int res=0;
5+
int min_price=INT_MAX;
6+
for(int i=0;i<prices.size();i++){
7+
res=max(res,prices[i]-min_price);
8+
min_price=min(prices[i],min_price);
9+
}
10+
return res;
11+
}
12+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
2+
3+
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
4+
5+
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
6+
7+
 
8+
9+
示例 1:
10+
11+
输入: [7,1,5,3,6,4]
12+
输出: 7
13+
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
14+
  随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
15+
示例 2:
16+
17+
输入: [1,2,3,4,5]
18+
输出: 4
19+
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
20+
  注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
21+
  因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
22+
示例 3:
23+
24+
输入: [7,6,4,3,1]
25+
输出: 0
26+
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
27+
 
28+
29+
提示:
30+
31+
1 <= prices.length <= 3 * 10 ^ 4
32+
0 <= prices[i] <= 10 ^ 4
33+
34+
来源:力扣(LeetCode)
35+
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
36+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
37+
class Solution {
38+
public:
39+
int maxProfit(vector<int>& prices) {
40+
int res=0;
41+
int i=prices.size()-1;
42+
int j=prices.size()-1;
43+
while(i>=0){
44+
if(i-1>=0&&prices[i]>prices[i-1]) i--;
45+
else{
46+
res+=(prices[j]-prices[i]);
47+
i--;
48+
j=i;
49+
}
50+
}
51+
return res;
52+
}
53+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
int maxProduct(vector<int>& nums) {
4+
int res=INT_MIN;
5+
int nums_max=1;
6+
int nums_min=1;
7+
for(int i=0;i<nums.size();i++){
8+
if(nums[i]<0) nums_max^=nums_min^=nums_max^=nums_min;
9+
nums_max=max(nums_max*nums[i],nums[i]);
10+
nums_min=min(nums_min*nums[i],nums[i]);
11+
res=max(nums_max,res);
12+
}
13+
return res;
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
2+
3+
 
4+
5+
示例 1:
6+
7+
输入: [2,3,-2,4]
8+
输出: 6
9+
解释: 子数组 [2,3] 有最大乘积 6。
10+
示例 2:
11+
12+
输入: [-2,0,-1]
13+
输出: 0
14+
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
15+
16+
来源:力扣(LeetCode)
17+
链接:https://leetcode-cn.com/problems/maximum-product-subarray
18+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
19+
class Solution {
20+
public:
21+
int maxProduct(vector<int>& nums) {
22+
int res=INT_MIN;
23+
for(int i=0;i<nums.size();i++){
24+
int tmp=1;
25+
for(int j=i;j<nums.size();j++){
26+
tmp*=nums[j];
27+
res=max(tmp,res);
28+
}
29+
}
30+
return res;
31+
}
32+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
vector<int> twoSum(vector<int>& nums, int target) {
4+
int i=0;
5+
int j=nums.size()-1;
6+
vector<int> res;
7+
while(i<j){
8+
if(nums[i]+nums[j]==target){
9+
res.push_back(i+1);
10+
res.push_back(j+1);
11+
return res;
12+
}
13+
else if(nums[i]+nums[j]<target) i++;
14+
else if(nums[i]+nums[j]>target) j--;
15+
}
16+
return res;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
2+
3+
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
4+
5+
说明:
6+
7+
返回的下标值(index1 和 index2)不是从零开始的。
8+
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
9+
示例:
10+
11+
输入: numbers = [2, 7, 11, 15], target = 9
12+
输出: [1,2]
13+
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
14+
15+
来源:力扣(LeetCode)
16+
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
17+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
18+
class Solution {
19+
public:
20+
vector<int> twoSum(vector<int>& nums, int target) {
21+
vector<int> res;
22+
for(int i=0;i<nums.size();i++){
23+
for(int j=i+1;j<nums.size();j++){
24+
if(nums[i]+nums[j]==target){
25+
res.push_back(i+1);
26+
res.push_back(j+1);
27+
return res;
28+
}
29+
}
30+
}
31+
return res;
32+
}
33+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
2+
3+
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
4+
5+
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
6+
7+
 
8+
9+
示例 1:
10+
11+
输入: 2, [[1,0]]
12+
输出: true
13+
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
14+
示例 2:
15+
16+
输入: 2, [[1,0],[0,1]]
17+
输出: false
18+
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
19+
 
20+
21+
提示:
22+
23+
输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
24+
你可以假定输入的先决条件中没有重复的边。
25+
1 <= numCourses <= 10^5
26+
27+
来源:力扣(LeetCode)
28+
链接:https://leetcode-cn.com/problems/course-schedule
29+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
30+
class Solution {
31+
public:
32+
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
33+
vector<int> res;
34+
int in[numCourses];
35+
int out[numCourses];
36+
memset(in,0,sizeof(in));
37+
memset(out,0,sizeof(out));
38+
for(int i=0;i<prerequisites.size();i++){
39+
in[prerequisites[i][0]]++;
40+
out[prerequisites[i][1]]++;
41+
}
42+
int flag=1;
43+
while(flag){
44+
flag=0;
45+
for(int i=0;i<numCourses;i++){
46+
if(in[i]==0){
47+
flag=1;
48+
res.push_back(i);
49+
in[i]--;
50+
for(int j=0;j<prerequisites.size();j++){
51+
if(prerequisites[j][1]==i) in[prerequisites[j][0]]--;
52+
}
53+
}
54+
}
55+
}
56+
if(res.size()==numCourses) return 1;
57+
else return 0;
58+
}
59+
};
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*现在你总共有 n 门课需要选,记为 0 到 n-1。
2+
3+
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
4+
5+
给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。
6+
7+
可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。
8+
9+
示例 1:
10+
11+
输入: 2, [[1,0]]
12+
输出: [0,1]
13+
解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
14+
示例 2:
15+
16+
输入: 4, [[1,0],[2,0],[3,1],[3,2]]
17+
输出: [0,1,2,3] or [0,2,1,3]
18+
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
19+
  因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
20+
说明:
21+
22+
输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
23+
你可以假定输入的先决条件中没有重复的边。
24+
提示:
25+
26+
这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。
27+
通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。
28+
拓扑排序也可以通过 BFS 完成。
29+
30+
来源:力扣(LeetCode)
31+
链接:https://leetcode-cn.com/problems/course-schedule-ii
32+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
33+
34+
35+
//先计算出度和入度
36+
//push入入度为0值,将其入度置为-1
37+
//并开始查找其下个节点,将下个节点的入度-1
38+
class Solution {
39+
public:
40+
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
41+
vector<int> res;
42+
int in[numCourses];
43+
int out[numCourses];
44+
memset(in,0,sizeof(in));
45+
memset(out,0,sizeof(out));
46+
for(int i=0;i<prerequisites.size();i++){
47+
in[prerequisites[i][0]]++;
48+
out[prerequisites[i][1]]++;
49+
}
50+
int flag=1;
51+
while(flag){
52+
flag=0;
53+
for(int i=0;i<numCourses;i++){
54+
if(in[i]==0){
55+
flag=1;
56+
res.push_back(i);
57+
in[i]--;
58+
for(int j=0;j<prerequisites.size();j++){
59+
if(prerequisites[j][1]==i) in[prerequisites[j][0]]--;
60+
}
61+
}
62+
}
63+
}
64+
if(res.size()==numCourses) return res;
65+
else return (vector<int>)NULL;
66+
}
67+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
2+
3+
说明:
4+
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
5+
6+
示例 1:
7+
8+
输入: root = [3,1,4,null,2], k = 1
9+
3
10+
/ \
11+
1 4
12+
\
13+
  2
14+
输出: 1
15+
示例 2:
16+
17+
输入: root = [5,3,6,2,4,null,null,1], k = 3
18+
5
19+
/ \
20+
3 6
21+
/ \
22+
2 4
23+
/
24+
1
25+
输出: 3
26+
进阶:
27+
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
28+
29+
来源:力扣(LeetCode)
30+
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
31+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
32+
/**
33+
* Definition for a binary tree node.
34+
* struct TreeNode {
35+
* int val;
36+
* TreeNode *left;
37+
* TreeNode *right;
38+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
39+
* };
40+
*/
41+
class Solution {
42+
public:
43+
vector<int> tree;
44+
void fill_tree(vector<int>& tree,TreeNode* root){
45+
if(root){
46+
tree.push_back(root->val);
47+
fill_tree(tree,root->left);
48+
fill_tree(tree,root->right);
49+
}
50+
}
51+
int kthSmallest(TreeNode* root, int k) {
52+
fill_tree(tree,root);
53+
sort(tree.begin(),tree.end());
54+
return tree[k-1];
55+
}
56+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
2+
3+
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
4+
5+
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
6+
7+
示例:
8+
9+
给定 n = 5,并且 version = 4 是第一个错误的版本。
10+
11+
调用 isBadVersion(3) -> false
12+
调用 isBadVersion(5) -> true
13+
调用 isBadVersion(4) -> true
14+
15+
所以,4 是第一个错误的版本。 
16+
17+
来源:力扣(LeetCode)
18+
链接:https://leetcode-cn.com/problems/first-bad-version
19+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/
20+
// The API isBadVersion is defined for you.
21+
// bool isBadVersion(int version);
22+
23+
class Solution {
24+
public:
25+
int firstBadVersion(int n) {
26+
long i=1;
27+
long j=n;
28+
while(i<j){
29+
if(isBadVersion((i+j)/2)) j=(i+j)/2;
30+
else i=(i+j)/2+1;
31+
}
32+
return i;
33+
}
34+
};

0 commit comments

Comments
 (0)