Day Twenty-one
作者:互联网
算法
来源:力扣(LeetCode)207. 课程表
这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
示例 1:
输入: 2, [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。
示例 2:
输入: 2, [[1,0],[0,1]]
输出: false
解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。
提示:
输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
你可以假定输入的先决条件中没有重复的边。
1 <= numCourses <= 10^5
解题思路
这道题把它转换成数学思想就是:是否形成环,成环就进入死循环,既无法完成课程。环又是想到图的有向图,利用深度遍历,再来一个容器来判断是否遍历过(初始设为-1,未遍历状态),正在遍历设为0,已经遍历设为1(即无需在探索)。
代码
struct GraphNode{
int label;
vector<GraphNode*> neighbors;
GraphNode(int x):label(x){};
};
class Solution {
public:
bool DFS_graph(GraphNode* node,vector<int> &visit){
visit[node->label]=0;
for(int i=0;i<node->neighbors.size();i++){
if(visit[node->neighbors[i]->label]==-1){
if(DFS_graph(node->neighbors[i],visit)==0){
return false;
}
}else if(visit[node->neighbors[i]->label]==0){
return false;
}
}
visit[node->label]=1;
return true;
}
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<GraphNode*>graph;
vector<int> visit;
for(int i=0;i<numCourses;i++){
graph.push_back(new GraphNode(i));
visit.push_back(-1);
}
for(int i=0;i<prerequisites.size();i++){
GraphNode *begin=graph[prerequisites[i][1]];
GraphNode* end =graph[prerequisites[i][0]];
begin->neighbors.push_back(end);
}
for(int i=0;i<graph.size();i++){
if(visit[i]==-1&&!DFS_graph(graph[i],visit)){
return false;
}
}
for(int i=0;i<numCourses;i++){
delete graph[i];
}
return true;
}
};
来源:力扣(LeetCode)35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
解题思路
这题不难,就是二分查找某元素,就是在这基础上加了一条如果不在应该插入哪里的问题。如果元素在数组中这个我就不讲了,如果元素不再数组中就会有三种情况,比数组最大数大,比数组最小数小,这两种都好处理,最后一种就是在数组中。当我们用二分查找时如果nums[mid]小于目标数且nums[mid+1]大于目标数,那我们就可以知道目标数应该插入mid后面即mid+1;如果nums[mid]大于目标数且nums[mid-1]小于目标数,那我们就可以知道目标数应该插入mid-1后面即mid;
代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int index=-1;
int begin=0;
int end=nums.size()-1;
while(index==-1){
int mid=(begin+end)/2;
if(target==nums[mid]){
index=mid;
}else if(target<nums[mid]){
if(mid==0||target>nums[mid-1]){
index=mid;
}
end=mid-1;
}else if(target>nums[mid]){
if(mid==nums.size()-1||target<nums[mid+1]){
index=mid+1;
}
begin=mid+1;
}
}
return index;
}
};
标签:nums,int,Twenty,visit,mid,课程,graph,Day 来源: https://blog.csdn.net/weixin_44928513/article/details/113532008