1. 程式人生 > >求一個數組中右邊第一個比他大的數(單調棧)

求一個數組中右邊第一個比他大的數(單調棧)

題意思路如標題

int main()
{
    int n;
    cin >> n;
    int a[MAXN];
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    int dp[MAXN];
    int mie[MAXN];
    memset(dp, 0, sizeof(dp));
    int cnt = n;
    mie[cnt] = INT_MAX;
    for (int i = n - 1; i >= 0; --i) {
        if (cnt <= n && a[i] >= mie[cnt]) cnt++;
        dp[i] = mie[cnt];
        mie[--cnt] = a[i];
    }
    for (int i = 0; i < n; ++i)
        cout << dp[i] << " ";
    return 0;
}

相關推薦

個數右邊第一大的數單調

題意思路如標題 int main() { int n; cin >> n; int a[MAXN]; for (int i = 0; i < n; ++i) { cin >> a[i];

個數最小的K數字

用快排思想:import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; class Solution

快速找出個數的兩數字,讓這兩數字之和等於一個給定的值

http 知識 繼續 進一步 repl 有一個 tails 窮舉 too 我覺得寫得很清晰,希望沒有侵犯作者的著作權,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一個數組中的兩個數字,讓這

O(n)個數連續區間和的最大值

return 區間 scan CI spa 最大 %d 區間和 數組 int n, a[5000]; int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++)cin >>

個數最大值與最小值

div return urn 技術 code include 一個 最小值 array #include <stdio.h> int main() { int array[10]={100,1,40,29,45,22,98,2,83,75};

C語言:個數只有兩數字是出現

1 //1.一個數組中只有兩個數字是出現一次, 2 //其他所有數字都出現了兩次。 3 //找出這兩個數字,程式設計實現。a 4 5 //^=單獨兩個數的^結果 6 //單獨出現的兩個數不同位的標記 7 //position: ^結果中第一個出現1的位置 8 //position位

個數只有兩數字是出現次, 其他所有數字都出現了兩次,找出這兩數字

題目:一個數組中只有兩個數字是出現一次, 其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 參考程式碼: #include<stdio.h> #include <windows.h> void find_num(int arr[], int len

java二分法來個數一個值的key

package TestArray;import java.util.Arrays;/** * 二分法查詢 */public class Test { public static void main(String[] args) { int[] arr = {30, 20, 50, 10,

個數只有兩數字是出現次,其他所有數字都出現了兩次。 找出這兩數字,程式設計實現。

1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,

個數只有兩數字是出現次別的所有數字都出現了兩次找出這兩數字

int main() { int arr[] = { 1, 3, 8, 1, 3, 8, 4, 6 }; int sz = sizeof(arr) / sizeof(arr[0]); int num = 0; int pos = 0; int i =

個數出現次數超過n/3的數(c++實現)

題目要求如下: 令A是一個長度為n的正整數序列。試設計一個時間 和空間複雜度分別為O(n)和O(1) 的演算法,判斷A中 是否存在這樣的元素x,x在序列中出現次數超過n/3。 若存在這樣的x,則將其輸出。 實現思路: 、BM(Boyer-Moore Majority V

php從個數刪除多元素,獲取陣列鍵值對等……

$array1 = array(1,2,3,4,5,6); $array2 = array(2,3); //1、獲取陣列鍵值對 $arr1 = array_keys($array2); var_dump($arr1); Array ( [0] => 0 [1] =&g

java實現遞迴函式入門級例子:用遞迴函式個數的最大值

我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class FindMax { public sta

個數是否存在兩元素,滿足相加為另個數

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9

個數實現兩堆疊

函式介面定義: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其

PTA 資料結構與演算法題目集中文6-7 在個數實現兩堆疊

6-7 在一個數組中實現兩個堆疊(20 分)本題要求在一個數組中實現兩個堆疊。函式介面定義:Stack CreateStack( int MaxSize ); bool Push( Stack S, E

php 找出個數的兩數字,讓這兩數字之和等於一個給定的值

有關於php的有好幾種思路,很多部落格都有我就不一一介紹了,只是貼程式碼僅供參考。 問題:給一個一維陣列,不確定具體有多少元素,例如$arr = [1,2,3,4,3,2,1],讓他們任意兩數字相加的和等於一個給定的值,比如說 5 ,可能有好幾個兩個數相加都是5,但只是取最

程式設計師面試題:快速找出個數的兩數字,讓這兩數字之和等於一個給定的值

能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。 假如有如下的兩個陣列,如圖所示: 5,6,1,4,7,9,8 給定Sum= 10 1,5,6,7,8,9 給定Sum=

演算法12--topK個數第k大的數

求一個數組中第k大的值 解法一: 建立一個k個元素的最大堆,首先將陣列中前k個元素放入堆中,此時堆頂元素為第k大的元素,後面繼續遍歷陣列,比較堆頂元素與陣列中元素值,當陣列中元素小於堆頂元素時,將堆頂元素彈出,新元素入堆,這樣最終堆頂元素即為第k大。 可以直接利用Jav

【C語言】個數只有兩數字是出現次,其他所有數字都出現了兩次。 找出這兩數字,程式設計實現。

一看到這道題,我想到了之前學習過的異或。我們知道兩個相同的數字異或的結果是 0,因為在計算機中,異或運算是按照二進位制位來運算的,相同為 0 ,相異為  1。任何數與 0 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,