求陣列相鄰元素差值的最大值快速演算法(C++版)
整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。
給定一個int陣列A和A的大小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
Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一個數組定義困難值是兩個相鄰元素之間差的最大值。 給一個數組,可以去掉任意一個元素,問剩余數列的困難值的最小值是多少】
分析 options force minimum sta cif als 最小 技術分享 A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 mega
用指標法通過一個函式求出陣列元素中的最大值與最小值
#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>