用二分法尋找最長連續單調遞增子串行

2021-04-03 00:32:27 字數 1767 閱讀 3906

/* 在由n個數組成的序列中,找出最長的單調遞增子串行。子串行是連續的 */

#include

using namespace std;

template

void arrcopy ( const t       arrsource,

const int&    startposition,

t *&          arrdestination,

const int&    count )

arrdestination = new t[count];

int pos = 0;

for ( int i = startposition; i < startposition+count; ++i )}

template

void printarr ( const t     arr,

const int&  size )

cout << endl;}

template

void getmaxincsubarr( const t       arr,     //  源序列

const int&    size,      //  源序列的長度

t *&          sub,       //  生成的子串行

int&          subsize )  //  子串行的長度

//  確定tempsubsize的值

int tempsubsize = 1;

int pointer = size >> 1;    //  pointer指向源序列的中部

while( pointer + 1 < size &&

arr[pointer+1] > arr[pointer] )

pointer = size >> 1;    //  指示器重新指向源序列的中部

while( pointer > 0 &&

arr[pointer-1] < arr[pointer] )

//  pointer現在指向了位於源序列中部的單調遞增子串行的首元素

if ( tempsubsize > subsize )

int * left = 0; // left是位於源序列中部的單調遞增子串行的左邊部分

int leftsize = pointer;

if ( leftsize > subsize )

int * right = 0;    // right是位於源序列中部的單調遞增子串行的右邊部分

int rightsize = size - pointer - subsize;

if ( rightsize > subsize )

if ( pointer > subsize )

if(rightsize > subsize)}

int main(int argc, char* argv)

;int size = sizeof(arr)/sizeof(int);

int* sub = 0;

int subsize = 0;

getmaxincsubarr(arr, size, sub, subsize);

cout << subsize << endl;

printarr(sub, subsize);

delete sub;

cin.get();   

return 0;}

尋找假幣問題(二分法)

有n個硬幣,編號為1 n,其中有乙個假幣,且假幣較輕,如何採用天平稱重方式找到這個假幣?可採用如下的分治演算法解決這個問題 如果n為偶數,則將這n個硬幣分成兩等份,並將兩份硬幣放到天平兩端,假幣在較輕的那端 2,如果n為奇數,則取出第1個硬幣後將其餘硬幣分成兩等份,並將兩份硬幣放到天平兩端 2.1 ...

用二分法查詢迴圈遞增序列 Python

問題 使用二分法在迴圈遞增序列中查詢指定元素,返回其下標 若不存在,則返回 1.要求時間複雜度為 o logn 迴圈遞增序列的定義 nums 7,8,9,10,1,2,3,4,5,6 即,乙個序列被分為兩個子串行,每個子串行都是遞增的,並且如果在指定位置 如 10 1 之間 切斷重組,則可以變為遞增...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...