1. 程式人生 > 其它 >小程式60s驗證碼倒計時實現

小程式60s驗證碼倒計時實現

技術標籤:演算法分類題解

位元組面試考到的知識點,對輸入整數資料流取中位數,面試當時想到了單調佇列的方法,維護一個單調佇列總的時間複雜度為O(n^2),現場沒撕出來,後來去leetcode提交最後一個測試案例超時

不過想法應該是對的,後來看答案是用堆的調整O(nlogn),複習下堆排序,

1.堆排序c++實現

1.1 準備

排序需要藉助一個交換函式swap可以自己實現也可以用c++的實現

#include<bits/stdc++.h>
using namespace std;

void swap(int arr[], int a, int b){
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
	return ;
}

1.2 堆的區域性調整heapify

排序陣列的長度為n,heapify將子結點較大的數移動到i的位置,最好的情況如果i為最大則則不需調整,最壞的情況一直調整到葉子結點調整的次數為樹的高度,即O(log(n))

//時間複雜度為 O(logn) 
void heapify(int arr[], int n, int i){
	int c1 = 2 * i + 1; // 左結點
	int c2 = 2 * i + 2; // 右結點
	int max = i;
	if(c1 < n && arr[c1] > arr[max]){
		max = c1;
	}
	if(c2 < n && arr[c2] > arr[max]){
		max = c2;
	}
	if(max != i){
		swap(arr, i, max);
		heapify(arr, n, max);
	}
}

1.3 建堆

//時間複雜度為 O(logn) 
void buildheap(int arr[], int n){
	int l = (n - 1)/2; // 最後一個需要調整的結點位置
	for(int i = l; i>=0 ;i--){
		heapify(arr, n, i);
	}
} 

1.4 堆排序

將堆的第一個數和最後一個數交換,調整堆的長度減小1,

//時間複雜度為 O(nlogn) 
void heapsort(int arr[], int n){
	
	for(int i=n;i>0;i--){
		swap(arr, 0, i-1);
		buildheap(arr, i-1);
	}
} 

1.5 測試


int main(){
	
	int arr[7] = {1,31,1,0,0,5,4};
	cout<<"開始建堆"<<endl; 
	buildheap(arr, 7);
	
	for(int i=0;i<7;i++){
		cout<<arr[i]<<endl;
	}
	cout<<"開始排序"<<endl;
	heapsort(arr, 7);
	for(int i=0;i<7;i++){
		cout<<arr[i]<<endl; 
	} 
	return 0;
}