-
题目大意:找到左边均小于自己和右边均大于自己的数字,这些数字可能是第一次partition选中的pivot
-
思路1:用二重循环硬解题
超时,就算用数组也超时,应该是因为二重循环太耗时了。
-
知识点:
- vector
- sort
-
代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n, num, i, j; scanf("%d", &n); vector<int> v(n); vector<int> candidates; for(i = 0; i < n; i++){ scanf("%d", &v[i]); } for(i = 0; i < n; i++){ bool flag = true; for(j = 0; j < n; j++){ if((j < i && v[j] > v[i]) || (j >= i && v[j] < v[i])){ flag = false; break; } } if(flag == true) candidates.push_back(v[i]); } sort(candidates.begin(), candidates.end()); printf("%d\n", candidates.size()); for(auto it = candidates.begin(); it != candidates.end(); it++){ if(it != candidates.begin()) printf(" "); printf("%d", *it); } printf("\n"); // 细节:当没有找到pivot时,要输出"0\n\n" return 0; }
-
-
思路2(柳诺):给数组排序,比较原来数组中每个元素的位置和排序后元素的位置是否改变
还需判断a[i]左边的最大值是否小于a[i]:若数组为`[4,1,6,5,7,2],排完序后5的位置不变,但它不是pivot。
-
知识点:
- vector
- sort
-
代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n, left_max = 0; scanf("%d", &n); vector<int> a(n), b(n), candidates; for(int i = 0; i < n; i++) scanf("%d", &a[i]); b = a; sort(b.begin(), b.end()); for(int i = 0; i < n; i++){ if(a[i] == b[i] && left_max < a[i]){ // 细节:还需判断a[i]左边的最大值是否小于a[i](我只考虑所给样例里的情况,没有严谨的考虑题目) candidates.push_back(a[i]); } if(left_max < a[i]) left_max = a[i]; } printf("%d\n", candidates.size()); for(int i = 0; i < candidates.size(); i++){ if(i != 0) printf(" "); printf("%d", candidates[i]); } printf("\n"); // 细节:当没有找到pivot时,要输出"0\n\n" return 0; }
-
-
总结:
-
一般情况不要用二重循环解决问题,很容易超时;
-
细节:
- 还需判断a[i]左边的最大值是否小于a[i](我只考虑所给样例里的情况,没有严谨的考虑题目);
- 当没有找到pivot时,要输出"0\n\n"(题目没说清);
-
还有一种方法:找出每个a[i]左边的最大值和右边的最小值,若
a[i] > l_max && a[i] < r_min
,则记录a[i]。但我没看懂别人的代码,以后有机会再用这个方法做题。
-
我做题经常有一两个测试点每通过,是因为一般情况下我只考虑所给样例里的情况,没有严谨的所有情况。我做题都是凭直觉,一点都不严谨!!!!以后要注意细节。
-
【PAT】1101 Quick Sort (25 分)
最新推荐文章于 2021-09-08 20:03:05 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)