刷題經驗 C C 陣列 排序 查詢

2021-10-05 13:53:28 字數 4317 閱讀 6049

3. 搜尋(查詢)

0. 參考與引用

4個月沒有碰鍵盤了,開學遙遙無期,偏偏電腦還在學校,取不得,真叫人藍瘦。來到大姑家,一部12年前的台式電腦,登陸了久違的leetcode,一道簡單的題目(56. 合併區間),但是c++語法點難住我了,大致思路是二維陣列按照區間左端點從小到大排序,然後看排序後的每乙個區間的右端點是否大於等於其右相鄰區間的左端點,如果是則合併為乙個區間並更新最終返回的ans二維陣列。

現在的問題是二維陣列的排序我忘記了,找了一遍csdn部落格沒有類似的題目解析,於是我打算從此把以後所有關於c/c++排序的**經驗碼到這篇文章,方便日後查閱。

還有一些搜尋技巧和方法。

如果是乙個二維陣列,也可以是用sort,我們可以選擇根據某一列來進行排序,如果我們不重寫cmp函式,那麼預設的是根據第一列來排序,當然我們可以通過重寫來根據其他列來排序:

/* input matrix

m = [4 2

8 35 1 ]

*/// ascending order by first column

sort

(m.begin()

, m.

end())

;/*m = [8 3

4 2

5 1 ]

*/// descending order by first column

sort

(m.rbegin()

, m.

rend()

);/*m = [5 1

4 2

8 3]

*/// ascending order by second column

sort

(m.begin()

, m.

end(),

(const vector<

int>

&a,const vector<

int>

&b))

;bool

cmp(

const vector<

int>

&a,const vector<

int>

&b)sort

(m.begin()

, m.

end(

), cmp);/*

m = [4 2

5 18 3 ]

*/// descending order by second column

sort

(m.begin()

, m.

end(),

(const vector<

int>

&a,const vector<

int>

&b))

;bool

cmp(

const vector<

int>

&a,const vector<

int>

&b)sort

(m.begin()

, m.

end(

), cmp);/*

m = [8 3

5 14 2 ]

*/

資料序列的排序最主要的目的是為了方便查詢。其中二分最常用。首先我們從演算法的兩種實現**來一窺二分的魅力。

// c++ program to implement recursive binary search 

#include

using

namespace std;

// a recursive binary search function. it returns

// location of x in given array arr[l..r] is present,

// otherwise -1

intbinarysearch

(int arr,

int l,

int r,

int x)

// we reach here when element is not

// present in array

return-1

;}intmain

(void);

int x =10;

int n =

sizeof

(arr)

/sizeof

(arr[0]

);int result =

binarysearch

(arr,

0, n -

1, x)

;(result ==-1

)? cout <<

"element is not present in array"

: cout <<

"element is present at index "

<< result;

return0;

}

// c++ program to implement recursive binary search 

#include

using

namespace std;

// a iterative binary search function. it returns

// location of x in given array arr[l..r] if present,

// otherwise -1

intbinarysearch

(int arr,

int l,

int r,

int x)

// if we reach here, then element was

// not present

return-1

;}intmain

(void);

int x =10;

int n =

sizeof

(arr)

/sizeof

(arr[0]

);int result =

binarysearch

(arr,

0, n -

1, x)

;(result ==-1

)? cout <<

"element is not present in array"

: cout <<

"element is present at index "

<< result;

return0;

}

// binary_search example

#include

// std::cout

#include

// std::binary_search, std::sort

#include

// std::vector

bool myfunction (

int i,

int j)

int main ();

std::vector<

int>

v(myints,myints+9)

;// 1 2 3 4 5 4 3 2 1

// using default comparison:

std::sort (v.

begin()

, v.

end())

; std::cout <<

"looking for a 3... ";if

(std::binary_search (v.

begin()

, v.

end(),

3)) std::cout <<

"found!\n"

;else std::cout <<

"not found.\n"

;// using myfunction as comp:

std::sort (v.

begin()

, v.

end(

), myfunction)

; std::cout <<

"looking for a 6... ";if

(std::binary_search (v.

begin()

, v.

end(),

6, myfunction)

) std::cout <<

"found!\n"

;else std::cout <<

"not found.\n"

;return0;

}

Leetcode刷題經驗

該題可以很輕易地看出來是使用回溯 排序,排序是為了更好地剪枝。解題思路 假設輸入為can dida tes 2,3 6,7 ta rget 7。candidates 2,3,6,7 target 7。candid ates 2,3,6,7 t arge t 7。依次拿出can dida tescan...

C C 程式設計題刷題 分組

題目描述 2020年一共有n名員工參加入職培訓,第i名員工擁有乙個戰力值x i 在入職培訓中有乙個小活動需要把所有員工分為a b兩組進行比拼對決。為了讓活動更有趣味性,小q希望兩組的人數盡量均分 即兩組人數之差不超過1 並且要讓兩組盡量勢均力敵 a組的戰力值之和與b組的戰力值之和的差值盡量小 小q把...

刷題 二維陣列查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。package timufuxi public class kaoshi boolean symbol sol...