zoukankan      html  css  js  c++  java
  • 1045 快速排序 (25分)

    这样是会超时的。。。因为循环了很多遍

    for (i = 0; i < n; i++) {
    		flag = 0;
    		for (j = 0; j < i; j++) {
    			if (a[j] > a[i]) {
    				flag = 1;
    				break;
    			}
    		}
    		if (flag == 0) {
    			for (j = i + 1; j < n; j++) {
    				if (a[j] < a[i]) {
    					flag = 1;
    					break;
    				}
    			}
    		}
    		if (flag == 0) {
    			result[sum++] = a[i];
    		}
    	}
    

    改了一下

    第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 10^9


    算法思想:

    输入n个数,定义两个数组 leftmax, rightmin。leftmax[i]存储a[i]左边的数的最大值;rightmin[i]存储a[i]右边的数的最小值

    第一个数的leftmax[0] = 0

    最后一个数的rightmin[0] = 1000000000

    然后再循环一遍如果 a[i] > leftmax[i] && a[i] < rightmin[i],就是主元!!

    这样只需循环3遍!

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    #define maxsize 100100
    #define INF 1000000000  //定义一个
    
    int main() {
    	int n,i;
    	int a[maxsize],leftmax[maxsize],rightmin[maxsize],result[maxsize];
    	int sum = 0;
    	cin >> n;
    	for (i = 0; i < n; i++) {
    		cin >> a[i];
    	}
    	leftmax[0] = 0;
    	//左边第一个数的leftmax的是自己,题目中给出的是不同的数
    	for (i = 1; i <= n-1; i++) {
    		leftmax[i] = max(leftmax[i - 1], a[i - 1]);
    	}
    	rightmin[n - 1] = INF;
    	for (i = n - 2; i >= 0; i--) {
    		rightmin[i] = min(rightmin[i + 1], a[i + 1]);
    	}
    	for (i = 0; i < n; i++) {
    		if (a[i] > leftmax[i] && a[i] < rightmin[i]) {
    			result[sum++] = a[i];
    		}
    	}
    	cout << sum << endl;
    	sort(result, result + sum);
    	for (i = 0; i < sum; i++) {
    		cout << result[i];
    		
    		if (i < sum - 1) {
    			cout << " ";
    		}
    	}
    	cout << endl;    //测试点3---格式错误----醉了
    	return 0;
    }
    
  • 相关阅读:
    IMYSQL-叶金荣
    mysql命令
    实效云计算用户组(ECUG) 与 阿里云
    GO 语言
    MYSQL 源代码编绎脚本
    MYSQL 源代码学习
    LINUX 性能工具使用
    CentOS 5.8 上安装 systemtap-2.6 转
    mysql php nginx
    redis 安装
  • 原文地址:https://www.cnblogs.com/tanghm/p/12659493.html
Copyright © 2011-2022 走看看