Leetcode Test
2605 从两个数字数组里生成最小数字(9.5)
给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。
提示:
1 <= nums1.length, nums2.length <= 91 <= nums1[i], nums2[i] <= 9- 每个数组中,元素 互不相同 。
【hash table】
int minNumber(int* nums1, int nums1Size, int* nums2, int nums2Size){int n1=nums1Size,n2=nums2Size;int hash[10]={0};int min1=10,min2=10;for(int i=0;i<n1;i++){hash[nums1[i]]++;min1=fmin(min1,nums1[i]);}for(int i=0;i<n2;i++){hash[nums2[i]]++;min2=fmin(min2,nums2[i]);}//找出现过2次的数字,以及两个arr中的最小数int equal=0,min=10;for(int i=1;i<10;i++){if(hash[i]==2){equal=1;min=fmin(min,i);}}//有出现过2次数字,直接返回最小数if(equal) return min;else{if(min1>min2){return min1+min2*10;}else{return min2+min1*10;}}
}
1123 最深叶节点的最近公共祖先(9.6)
给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。
回想一下:
- 叶节点 是二叉树中没有子节点的节点
- 树的根节点的 深度 为
0,如果某一节点的深度为d,那它的子节点的深度就是d+1 - 如果我们假定
A是一组节点S的 最近公共祖先,S中的每个节点都在以A为根节点的子树中,且A的深度达到此条件下可能的最大值。
提示:
- 树中的节点数将在
[1, 1000]的范围内。 0 <= Node.val <= 1000- 每个节点的值都是 独一无二 的。
【递归】
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int getDepth(struct TreeNode *root){if(!root) return 0;//如果root==null,则返回0层return fmax(getDepth(root->left),getDepth(root->right))+1;//递归返回左右子树,层数++
}struct TreeNode* lcaDeepestLeaves(struct TreeNode* root){struct TreeNode *res=root,*cur=root;while(cur){ //当cur不为空时int left=getDepth(cur->left);int right=getDepth(cur->right);//left为当前节点的左节点的层//right为当前节点的右节点的层//层:从叶子节点往上的层数if(left==right){//如果左节点的层==右节点的层,则左右为叶子res=cur;break;}else if(left>right){//左更深cur=cur->left;}else{//右更深cur=cur->right;}}return res;
}
2594 修车的最少时间(9.7)
给你一个整数数组 ranks ,表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。
同时给你一个整数 cars ,表示总共需要修理的汽车数目。
请你返回修理所有汽车 最少 需要多少时间。
**注意:**所有机械工可以同时修理汽车。
提示:
1 <= ranks.length <= 1051 <= ranks[i] <= 1001 <= cars <= 106
【二分法】
能力值为r的工人,最多可以修sqrt(t/r)个车
二分上界为:min(ranks) x cars x cars
即让能力最低的人修好所有车,消耗的时间
int check(long long n,int cars,int *ranks,int ranksSize){long long sum=0;for(int i=0;i<ranksSize;i++){sum+=sqrt(n/ranks[i]);}return sum>=cars;
}long long repairCars(int *ranks,int ranksSize,int cars){long long left=1,right=ranks[0];for(int i=0;i<ranksSize;i++){right=fmin(ranks[i],right);}right=right*cars*cars-1;while(left<=right){long long mid=(left+right)/2;if(check(mid,cars,ranks,ranksSize)){right=mid-1;}else{left=mid+1;}}return left;
}
2651 计算列车到站时间(9.8)
给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。
返回列车实际到站的时间。
注意,该问题中的时间采用 24 小时制。
提示:
1 <= arrivaltime < 241 <= delayedTime <= 24
【模拟】
int findDelayedArrivalTime(int arrivalTime, int delayedTime){return (arrivalTime+delayedTime)%24;
}
207 课程表(9.9)
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
- 例如,先修课程对
[0, 1]表示:想要学习课程0,你需要先完成课程1。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
提示:
1 <= numCourses <= 20000 <= prerequisites.length <= 5000prerequisites[i].length == 20 <= ai, bi < numCoursesprerequisites[i]中的所有课程对 互不相同
【拓扑】
题解:207. 课程表 - 力扣(LeetCode)
bool canFinish(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize){if(prerequisitesSize==0) return 1;int *ans=malloc(sizeof(int)*numCourses);for(int i=0;i<numCourses;i++){ans[i]=0;}int res=0;for(int i=0;i<prerequisitesSize;i++){//update in-point of every pointans[prerequisites[i][0]]++;}for(int i=0;i<numCourses;i++){if(ans[i]==0){//current course is doneres++;if(res==numCourses){//learned courses == total coursesreturn 1;}for(int j=0;j<prerequisitesSize;j++){if(prerequisites[j][1]==i){//must-learn course of [j] is learntans[prerequisites[j][0]]--;}}ans[i]--;i=-1;}}return 0;
}
210 课程表Ⅱ(9.10)
现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
- 例如,想要学习课程
0,你需要先完成课程1,我们用一个匹配来表示:[0,1]。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
提示:
1 <= numCourses <= 20000 <= prerequisites.length <= numCourses * (numCourses - 1)prerequisites[i].length == 20 <= ai, bi < numCoursesai != bi- 所有
[ai, bi]互不相同
【拓扑】
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* findOrder(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize, int* returnSize){int** edges = (int**)malloc(sizeof(int*) * numCourses);for (int i = 0; i < numCourses; i++) {edges[i] = (int*)malloc(0);}int edgeColSize[numCourses];memset(edgeColSize, 0, sizeof(edgeColSize));int indeg[numCourses];memset(indeg, 0, sizeof(indeg));for (int i = 0; i < prerequisitesSize; ++i) {int a = prerequisites[i][1], b = prerequisites[i][0];edgeColSize[a]++;edges[a] = (int*)realloc(edges[a], sizeof(int) * edgeColSize[a]);edges[a][edgeColSize[a] - 1] = b;++indeg[b];}int q[numCourses];int l = 0, r = -1;for (int i = 0; i < numCourses; ++i) {if (indeg[i] == 0) {q[++r] = i;}}int* result = (int*)malloc(sizeof(int) * numCourses);int resultSize = 0;int visited = 0;while (l <= r) {++visited;int u = q[l++];result[resultSize++] = u;for (int i = 0; i < edgeColSize[u]; ++i) {--indeg[edges[u][i]];if (indeg[edges[u][i]] == 0) {q[++r] = edges[u][i];}}}for (int i = 0; i < numCourses; i++) {free(edges[i]);}free(edges);if (visited == numCourses) {*returnSize = numCourses;} else {*returnSize = 0;}return result;
}
630 课程表Ⅲ(9.11)
这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。
你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。
返回你最多可以修读的课程数目。
提示:
1 <= courses.length <= 1041 <= durationi, lastDayi <= 104
【C++的优先队列】(不会orz)
class Solution {
public:int scheduleCourse(vector<vector<int>>& courses) {sort(courses.begin(), courses.end(), [](const auto& c0, const auto& c1) {return c0[1] < c1[1];});priority_queue<int> q;// 优先队列中所有课程的总时间int total = 0;for (const auto& course: courses) {int ti = course[0], di = course[1];if (total + ti <= di) {total += ti;q.push(ti);}else if (!q.empty() && q.top() > ti) {total -= q.top() - ti;q.pop();q.push(ti);}}return q.size();}
};