程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話找出數組中的特定元素的算法解析

C說話找出數組中的特定元素的算法解析

編輯:關於C++

C說話找出數組中的特定元素的算法解析。本站提示廣大學習愛好者:(C說話找出數組中的特定元素的算法解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話找出數組中的特定元素的算法解析正文


     成績描寫:一個int數組,外面數據無任何限制,請求求出一切如許的數a[i],其右邊的數都小於等於它,左邊的數都年夜於等於它。可否只用一個額定數組和大批其它空間完成。
      思緒:假如能用兩個幫助數組,那末絕對來講簡略一點,可界說數組Min和數組Max,個中Min[i]表現自a[i]以後的最小值(包含a[i]),Max[i]表現自a[i]之前元素的最年夜值。有了這兩個幫助數組後,關於a[i],假如它年夜於Max[i-1]而且小於Min[i+1],那末就相符請求。
      然則標題請求是只用一個額定數組,其實Max數組可以省去,完整可以邊斷定邊盤算,這是由於Max[i]是自左往右盤算的,而斷定時也是自左往右,兩個進程正好可以合起來。只需用一個變量Max保留一下以後的最年夜值便可。上面給出兩種辦法的代碼完成。
      參考代碼:

//函數功效 : 找元素 
//函數參數 : pArray指向數組,len為數組的元素個數 
//前往值 : 無 
void FindElements_Solution1(int *pArray, int len) 
{ 
  if(pArray == NULL || len <= 0 ) 
    return ; 
 
  int *pMin = new int[len]; 
  int *pMax = new int[len]; 
  int i; 
 
  pMax[0] = pArray[0]; 
  for(i = 1; i < len; i++)    //盤算自i往前最年夜值的幫助數組 
    pMax[i] = (pMax[i-1] >= pArray[i])? pMax[i-1]: pArray[i]; 
  pMin[len-1] = pArray[len-1]; 
  for(i = len - 2; i >= 0; i--) //盤算自i開端最小值的幫助數組 
    pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i]; 
 
  if(pArray[0] <= pMin[0])   //檢討第1個元素能否知足前提 
    cout<<pArray[0]<<' '; 
  for(i = 1; i < len - 1; i++) 
  { 
    if(pArray[i] >= pMax[i-1] && pArray[i] <=pMin[i+1]) //知足這個關系式的元素相符請求 
      cout<<pArray[i]<<' '; 
  } 
  if(pArray[len-1] >= pMax[len-1]) //檢討第len個元素能否知足前提 
    cout<<pArray[i]; 
  cout<<endl; 
 
  delete [] pMin; 
  delete [] pMax; 
  pMin = pMax = NULL; 
} 

void FindElements_Solution2(int *pArray, int len) 
{ 
  if(pArray == NULL || len <= 0 ) 
    return ; 
 
  int *pMin = new int[len]; 
  int Max; 
  int i; 
 
  Max = pArray[0]; 
  pMin[len-1] = pArray[len-1]; 
  for(i = len - 2; i >= 0; i--) //盤算自i開端最小值的幫助數組 
    pMin[i] = (pMin[i+1] <= pArray[i])? pMin[i+1]: pArray[i]; 
 
  if(pArray[0] <= pMin[0])   //檢討第1個元素能否知足前提 
    cout<<pArray[0]<<' '; 
 
  for(i = 1; i < len - 1; i++) 
  { 
    if(pArray[i] >= Max && pArray[i] <=pMin[i+1]) //知足這個關系式的元素相符請求 
      cout<<pArray[i]<<' '; 
    Max = (Max < pArray[i])? pArray[i]: Max; //更新以後最年夜值 
  } 
  if(pArray[len-1] >= Max) //檢討第len個元素能否知足前提 
    cout<<pArray[i]; 
  cout<<endl; 
 
  delete [] pMin; 
  pMin = NULL; 
} 

找出數組中兩個只湧現一次的數字(數組)
 成績描寫:一個整型數組裡除兩個數字以外,其他的數字都湧現了兩次。請寫法式找出這兩個只湧現一次的數字。請求時光龐雜度是O(n),空間龐雜度是O(1)。
     思緒:假如只要一個數字只湧現一次,而其他都湧現兩次,則直接將一切數字做一次異或運算便可,由於相等的數字異或一下成果為0。假如有兩個數字只湧現一次,而其他數字湧現了兩次。該怎樣辦呢?《編程之美》一書供給了一種辦法,即先將一切數字做一次異或運算,獲得一個數字,然後以該數字的某非0位作為過濾位,將數組分紅兩個部門,此時只湧現一次的數字會被分到分歧的部門。如今成績就轉為只湧現一次的情形,對每部門分離做異或運算便可。
     參考代碼:

//函數功效 : 找出數組中兩個只湧現一次的數字 
//函數參數 : arr為源數組,len為數組元素個數,result用來寄存成果  
//前往值 :  無 
void FindIsolateTwo(int *arr, int len, int *result) 
{ 
  int i, all = 0, flag = 1; 
 
  for(i = 0; i < len ; i++) //一切數異或 
    all ^= arr[i]; 
 
  while(!(all&flag)) //尋覓過濾位 
    flag <<= 1; 
 
  result[0] = result[1] = 0; 
  for(i = 0; i < len; i++) //應用過濾位辨別 
  { 
    if(flag&arr[i]) 
      result[0] ^= arr[i]; 
    else 
      result[1] ^= arr[i]; 
  } 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved