1. 程式人生 > >同時找出陣列的最大值和最小值,要求時間複雜度為o(n)

同時找出陣列的最大值和最小值,要求時間複雜度為o(n)

#include <stdio.h>


void max_min(int A[],int n,int& max,int& min)
{
      int i;
      if(n%2==0)
      {
             if(A[0]>A[1])
            {
                 max=A[0];
                 min=A[1];
            }
           else
          {
               max=A[1];
               min=A[0];
           }
          for(i=2;i<n-1;i=i+2)
          {
              if(A[i]>A[i+1])
              {
                  if(max<A[i])
                        max=A[i];
                  if(min>A[i+1])
                        min=A[i+1];
               }
             else
            {
                if(max<A[i+1])
                    max=A[i+1];
               if(min>A[i])
                    min=A[i];
            }
         }
     }
    else
   {
          max=min=A[0];
          for(i=1;i<n-1;i=i+2)
         {
             if(A[i]>A[i+1])
              {
                  if(max<A[i])
                       max=A[i];
                  if(min>A[i+1])
                      min=A[i+1];
               }
              else
              {

                   if(max<A[i+1])
                         max=A[i+1];
                   if(min>A[i])
                         min=A[i];
              }
         }
      }
}


int main()
{
           int A[]={8,9,6,7,4,5};
           int max,min;
           max_min(A,6,max,min);
           printf("The maximum is %d\n",max);
           printf("The minimum is %d\n",min);
}

//在該實現中,我們只進行了3n/2次比較,如果採用單獨找出最大值與最小值的話,則要進行2n-2次比較。


相關推薦

同時陣列要求時間複雜on

#include <stdio.h> void max_min(int A[],int n,int& max,int& min) { int i; if(n%2==0) { if(

合併兩個有序陣列要求時間複雜On且只要到O1的輔助空間

i= 0表示有序陣列arr1的首元素,j = 未知,表示有序陣列arr2的首元素 ①首先比較第一個有序陣列arr1和第二個有序陣列arr2第一個元素的大小 如果arr1[i] < arr[j]

有12...一直到n的無序陣列求排序演算法並且要求時間複雜On,時間複雜O1

提示:用陣列值作為下標 分析:        對於一般陣列的排序顯然 O(n) 是無法完成的。       既然題目這樣要求,肯定原先的陣列有一定的規律,讓人們去尋找一種機會。 例如:原始陣列:           a = [ 10, 6,9, 5,2

已知長度n的線性表A採用順序儲存結構請寫一個時間複雜On、空間複雜O1的演算法該演算法可刪除線性表中所有item的資料元素。

語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq

設任意n個整數存放於陣列A[1..n]中試編寫演算法將所有正數排在所有負數前面要求:演算法時間複雜On

注意陣列的實際長度 #include <iostream> using namespace std; void sort(int A[],int n) { int i=0;//陣列的頭下標 int j,x; j=n-1;//陣列的尾下標 while

實現一個棧要求實現Push、Pop入棧、Min返回時間複雜O1

這道題考查棧的知識點,要求實現一個棧,在對這個棧進行入棧和出棧以及返回最小棧元素時要求時間複雜度為O(1)。 方法一: 用兩個棧,一個正常出入棧,另一個存最小棧,入棧的時候第一個站正常入,最小棧如果為空或者要入的data比最小棧的棧頂元素小的時候才給最小棧入棧。

n個數中的k個數問題求解要求複雜On

  首先我們都知道可以將n個元素建一個最(大|小)堆,O(n)。 下面一個很常見的做法就是,每步從堆頂拿掉一個元素,拿k次,就把前k個元素拿出來了。但問題是,每步拿掉一個元素之後,都需要log(n)的時間來將堆再次最­(大|小)化。所以拿k次的複雜度就是 klog(n)。有沒

【面試題】實現一個棧要求Push入棧PopMin返回的操作時間複雜O1

問題描述:實現一個棧,要求Push(入棧),Pop(出棧),Min(返回最小值的操作)的時間複雜度為O(1)  分析問題:要記錄從當前棧頂到棧底元素的最小值,很容易想到用一個變數,每push一個元素更新一次變數的值。那麼問題來了,當執行pop操作時,上一次的最小值就找不到

實現一個棧要求實現出棧、入棧、返回時間複雜O1

  由棧的一些基本操作,很容易使出棧和入棧的時間複雜度為O(1),但是由於入棧資料元素順序不一定是有序的,故不能直接實現返回最小值的時間複雜度為O(1)。下面提供兩種方法: (一)設定一個特殊的資料結構型別,包括兩個棧_data棧和_mindata棧,_data棧和原來的棧

1.給棧新增一個獲取的方法元素Integer型要求時間複雜O(1)

分析:在資料結構與演算法中,當要求時間複雜度最小時基本都是要犧牲空間複雜度。棧是先進後出,此處要求用棧實現一個獲取最小值的方法且時間複雜度為O(1),首先考慮的方向就是再借助一個棧來實現,這個棧主要用來儲存最小值序列(這個地方可以思考一下為什麼不能用一個變數來儲存最小值)。 下面直接附上程式碼:   

刪除線性表中所有x的元素要求時間複雜O(n)空間複雜O(1)

思路:統計不等於x的個數,用k記錄不等於x的元素的個數。邊統計邊把當前元素放在第k個位置上,最後修改表的長度 public static void del(List<Integer> l

有1,2,....一直到n的無序陣列,求排序演算法要求時間複雜O(n),空間複雜O(1)

http://blog.csdn.net/dazhong159/article/details/7921527 1、有1,2,....一直到n的無序陣列,求排序演算法,並且要求時間複雜度為O(n),空間複雜度O(1),使用交換,而且一次只能交換兩個數。 #include &

Algorithm 04 : 尋找兩個有序陣列中的第N個數要求時間複雜O(logm+logn)

Question : Give a divide and conquer algorithm for the following problem : you are given two sorted lists of size m and n

把一個含有N個元素的陣列迴圈右移K位要求時間複雜O(N)

分析與解法 假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。變換過程通過以下步驟完成: 1.逆序排列

編寫程式在一非遞減的順序表L中刪除所有相等的多餘元素。要求時間複雜On空間複雜O1

翠花上程式碼: Status delExcrescentValue(SeqList &S){ int flag = 0,val = S.elem[0];//記錄值不等的下標 //printf("%d\n",S.elem[0]); for(int i = 1;i

【劍指offer】二維陣列中的查詢——複雜On+m——採用PHP寫法

背景 今天偶然進入牛客網,看到《劍指offer》模組有演算法題,就開始試著答題   題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣

把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜O(N)

分析與解法 這個解法其實在《啊哈!演算法》有講到。 假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。

手搖演算法三重翻轉演算法空間複雜o1的歸併排序

http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1這篇文章對手搖演算法以及歸併排序有很詳細的講解!! 手搖演算法就是空間複雜度為O(1),僅僅是依靠交換操作來對字串

時間複雜O(m*n)長公共子串

什麼叫最長公共子串,就是兩個字串當中最長的連續的公共子串,注意連續;而子序列可以不連續,順序一樣即可,不要混淆。 對於兩個子串,我們先找出短字串L中(長的也可以)每個字元在長字串H中的位置,這樣我們就構建出一個二維表: L:deasdfe1ra H:unnasdsdfew3

騰訊面試題:模板實現一個棧要求Push入棧PopMax返回的操作時間複雜O(1)

解題思路:要用模板實現亂序入棧的陣列每次pop()出棧都能得到當前棧中Max的最大值,就必須在push()入棧時進行維護操作,使的每次入棧的元素都能夠找到合適的位置並push(),每次push()操作完成後棧中的元素都能夠按從棧頂到棧底從大到小排列即可。這就需要寫一個不同於常