1101.Quick Sort

1101.Quick Sort

題目分析

Input:
第一行:一個正整數N(N<=100000)
第二行:N個互不相同的正整數,用空格分隔
Output:
第一行:符合條件的數的個數
第二行:按照升序輸出

求解思路

  • int類型的數組arr[N]:存放了原始數據
  • maxBefore:當前左側最大值(初始化為-1)
  • minBehind:當前右側最小值(初始化為1000000005)
  • int類型的數組res[N]:存放結果
  • bool類型的數組flag[N]:flag[i]指示arr[i]是否為我們要找的元素,若是,flag[i]=true;否則flag[i]=false。
  1. 在輸入的時候,假設當前輸入為arr[i],判斷arr[i]是否大于maxBefore,同時更新maxBefore和flag[i]的值。
  2. 逆序遍歷數組,判斷arr[i]是否小于minBehind,若不是,將flag[i]的值更新為false。若此時flag[i]為true,則arr[i]為我們要找的元素,存入res數組中。
  3. 輸出時,若sum為0,則輸出空的一行(必須輸出空的一行,否則有的樣例不能通過);若sum不為0,調用sort()函數,將res數組升序排列后輸出。

C++源碼

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int N;
    int sum = 0;
    cin>>N;
    bool *flag = new bool[N];
    int *arr = new int[N];
    int *res = new int[N];
    int maxBefore = -1;
    int minBehind = 1000000005;

    for(int i = 0; i < N; i++)
    {
        flag[i] = true;
    }

    for(int i = 0; i < N; i++)
    {
        cin>>arr[i];
        if(arr[i] > maxBefore)
        {
            maxBefore = arr[i];
        }
        else
        {
            flag[i] = false;
        }
    }
    for(int i = N - 1; i >= 0; i--)
    {
        if(arr[i] < minBehind)
        {
            minBehind = arr[i];
        }
        else
        {
            flag[i] = false;
        }
        if(flag[i])
        {
            sum = sum + 1;
            res[sum - 1] = arr[i];
        }
    }
    cout<<sum<<endl;
    if(sum == 0)
    {
        cout<<endl;
    }
    else
    {
        //res[0..sum-1]
        sort(res, res + sum);
        for(int i = 0; i < sum; i++)
        {
            cout<<res[i];
            if(i != sum - 1)
            {
                cout<<" ";
            }
        }
    }
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容