1. 程式人生 > >求陣列相鄰元素差值的最大值快速演算法(C++版)

求陣列相鄰元素差值的最大值快速演算法(C++版)

題目:

整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。

給定一個int陣列AA的大小n,請返回最大的差值。保證陣列元素多於1個。

思路:

基於桶排序思想 n個數 n+1個桶 最後一個桶存最大數 那麼最大差值一定在非空桶的相鄰2個桶之間 且=(空桶右邊 min - 空桶左邊max)

演算法複雜度:

時間複雜度:O(n)

空間複雜度:O(n)

貼程式碼:

<span style="white-space:pre">	</span>// 計算桶號(/第幾號桶)
	int calBucketNum(long val, long len, long minVal, long maxVal)
	{
		return (int) ((val - minVal) * len / (maxVal - minVal));
	}

	int getMin(int a, int b)
	{
		return (a < b) ? a : b;
	}

	int getMax(int a, int b)
	{
		return (a > b) ? a : b;
	}

	// 桶排序思想
	int maxGap(vector<int> A, int n) 
	{
		if(A.size() < 2)
		{
			return 0;
		}

		int min = A[0], max = A[0];

		for(int i = 1; i < n; ++i)
		{
			min = (min > A[i]) ? A[i] : min;
			max = (max < A[i]) ? A[i] : max;            
		}

		// 最大值和最小值相等 返回0
		if(min == max)
		{
			return 0;
		}

		vector<bool> notEmpty(n + 1, false);	// 桶是否為空桶
		vector<int> maxs(n + 1, 0);				// 每個桶的最大值
		vector<int> mins(n + 1, 0);				// 每個桶的最小值

		// 桶號
		int bucketNum = 0;

		// 遍歷陣列元素 將其放入相應桶中
		for(int i = 0; i < n; ++i)
		{
			// 得到這個元素應該放在哪個桶
			bucketNum = calBucketNum(A[i], n, min, max);
			mins[bucketNum] = notEmpty[bucketNum] ? (getMin(mins[bucketNum], A[i])) : A[i];
			maxs[bucketNum] = notEmpty[bucketNum] ? (getMax(maxs[bucketNum], A[i])) : A[i];
			notEmpty[bucketNum] = true;			// 該桶不為空
		}

		// cnt   —— 遍歷到第幾個桶
		int cnt = 0, mx = 0;

		// 遍歷n+1個桶 
		while(cnt <= n)
		{
			// 找到第一個非空桶
			if(notEmpty[cnt])
			{
				mx = maxs[cnt];
				break;
			}
			cnt++;
		}

		int maxgap = 0;
		// 待求的差值最大值一定出現在空桶附近的相鄰2個桶之間
		while(cnt <= n)
		{
			if(notEmpty[cnt])
			{
				maxgap = getMax(maxgap, mins[cnt] - mx);
				mx = maxs[cnt];
			}
			cnt++;
		}

		return maxgap;
	}
測試函式:
int main(void)
{
	int a[] = {1,2,5,4,6};

	int len = sizeof(a) / sizeof(int);

	vector<int> v(a, a + len);

	Gap g;

	cout<<g.maxGap(v, len);
	
	return 0;
}

輸出:

2

相關推薦

陣列相鄰元素快速演算法(C++)

題目: 整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。 給定一個int陣列A和A的大小n,請返回最大的差值。保證陣列元素多於1個。 思路: 基於桶排序思想 n

動態規劃系列---陣列中兩個元素

題目 求陣列中兩個元素差的最大值(後面的元素減去前面的元素);對應實際生活中的股票買賣,找出可能的最大收益; 思路 類似於求陣列連續和的最大值; 儲存最大差值和最小值,遍歷陣列,如果當前元素-min>最大差值,則更新最大差值;如果當前元素<

java面試寶典page279 數對之(動態規劃)

package com.interview.datastructure; public class TestDynamicProgramming { //java面試寶典page279 求數對之差的最大值 //1.首先定義一個max方法來判斷儲存最大值 //2.如何構造動態規劃,如果原來

數對之

#include<iostream> #include<cstdio> #include<climits> #include<algorithm> using namespace std; int a[100000]; int ma

用指標法通過一個函式陣列元素中的

#include <stdio.h>#include <string.h>#define N 10                                                                     /*巨集定義*/

(動態規劃DP)面試題:陣列中兩個數的(只能下標的減去下標小的)符合無後效性

空間複雜度優化演算法 void sovle_maxSub_Dp_OptimalSpace(int *a, int n){ int S=0; int max_value=INT_MIN; int max_index=0; for(int i=n-2;i>=1;

輸入一個數組長度,動態建立陣列,所有元素隨機生成,輸出元素中的

int length = 0;         printf("輸入一個數組長度:");         scanf("%d", &length);         int *p = malloc(sizeof(int) * length);         for

C語言:從鍵盤輸入10個數存入一維陣列這10個數中的並輸出

題目:從鍵盤輸入10個數存入一維陣列,求這10個數中的最大值和最小值並輸出。 下面是我寫的程式,我用visual studio 2010編譯通過,執行正常。 源程式程式碼如下: #include "stdio.h" //從鍵盤輸入10個數存入一維陣列,求這10個數中的

Jsの數組練習-一組數中的,以及所在位置

span http ima scrip ice viewport 代碼實現 pre val 要求:求一組數中的最大值和最小值,以及所在位置 代碼實現: <!DOCTYPE html> <html lang="en"> <head>

Python:lambda表達式實現兩個變量的

函數 style ret 對象 else 兩個 說明 引用 spa lambda 表達式(又稱匿名函數)   作用:     創建一個匿名函數對象     同def 類似,但不提供函數名   格式:     lambda [參數1,參數2,.....]: 表達式(默認只能寫

任意一個區間中的 - 單調棧

連結:https://ac.nowcoder.com/acm/contest/223/C來源:牛客網 題目描述 給出長度為n的序列a,其中第i個元素為 ,定義區間(l,r)的價值為 請你計算出

10個整數中的

求10個整數中的最大值 #include <stdio.h> #include <windows.h> int main() { int a[] = { 12, 15, 45, 78, 21, 36, 42, 69, 96, 86 }; //定義一個數組a int s

Problem E: 三個字元中的

Problem E: 求三個字元中的最大值 Time Limit: 1 Sec  Memory Limit: 128 MB Description 輸入3個字元,輸出其中的最大值 Input 3個字元 Output 這三個字元中的最

十個整數中的

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main() { int a[10]; int i, max; printf("輸入十個數:\n"); for (i =

java實現遞迴函式入門級例子:用遞迴函式一個數組中的

我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class FindMax { public sta

用指向函式的指標變數作函式的引數兩個整數中的、和

//用指向函式的指標變數作函式的引數#include <stdio.h>#include <string.h>void main(){ int max(int,int);//函式宣告 int min(int,int);//函式宣告 int add(in

MATLAB sort函式應用——一個矩陣前L個及其在矩陣中的位置

For vectors, sort(X) sorts the elements of X in ascending order. For matrices, sort(X) sorts each column of X in ascending order.For N-D

java 陣列 math.max 方法取

package com; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args)

10 個整數中的

思路: 首先應該將自己要進行判斷的數字存入陣列中,在額外建立一個臨時變數用來儲存最大值,從陣列中的第一個元素開始和第二個元素進行大小的比較,將較大的那個值存入臨時變數中,然後依次進行比較,都次都是將最大的數存入臨時變數,直到陣列中的元素都比較完成 1 #include<stdio.h>