查詢旋轉陣列最小值

2021-08-29 23:22:05 字數 1640 閱讀 8989

求對於長度為n的陣列a,求子陣列的和接近0的子陣列。

例如:

定義n長度的空間sum[0…n-1],sum[i]是a的前i項和。

並且有sum[i+1]=sum[i]+a[i+1]。

首先對sum[i]進行排序,找到求和最接近的2個值。

同時記錄使得值最小的陣列最短的那一組。

如圖:

通過求取求和值最接近的一組資料可以找到零子陣列對應的位置,之後判斷是否是最短,即可求出最終零子陣列的具體對應位置。

第一步:逐位求和

第二步:對求和排序

第三步:尋找排序後相鄰差最小值

第四步:記錄位置

由於本文採用的是分治法排序,因此演算法複雜度為o(nlogn)

void devide(int *a, int n) 

sum[0] = a[0];

for (int i = 1; i < n; i++)

// 將求和值儲存下來

for (int i = 0; i < n; i++)

// 進行排序,排序演算法在後面給出,應用的是分治法

sort(sum, 0, n - 1);

// 定義sum排序後相鄰值相減後的最小值

int *min;

int *originalmin;

min = (int*)malloc(sizeof(int)*(n - 1));

originalmin = (int*)malloc(sizeof(int)*(n - 1));

min[0] = sum[1] - sum[0];

for (int i = 2; i < n; i++)

// 記錄使得sum相減最小時兩個用來相減值得具體資料

int less = min[0];

for (int i = 0; i < n - 1; i++)

} // 獲取零子陣列的起始座標

for (int i = 0; i < n; i++)

} // 獲取零子陣列的終止座標

for (int i = 0; i < n; i++)

} // 列印零子陣列

for (int i = firstpos + 1; i < secondpos + 1; i++)

}

分治排序法:

void sort(int *a, int from, int to) 

}

合併演算法:

void merge(int *a, int from, int mid, int to) 

else

} while (i <= mid)

while (j <= to)

t = 0;

while (from <= to)

}

查詢旋轉陣列的最小值

旋轉後的陣列變成兩個有序陣列,最小值為兩個陣列的的分界線,前面子陣列的值都大於後面子陣列的值 用索引left right分別指向首尾元素 若陣列是普通公升序陣列,則left 若陣列是迴圈公升序陣列,則left right 計算mid,若mid 若mid right,則,後半段是迴圈公升序陣列 直到找...

旋轉陣列求最小值

這是letcode上的一道題目 leetcode find minimum in rotated sorted array 一 什麼是旋轉陣列呢,就是乙個有序的陣列,在從某乙個位置開始,旋轉到陣列的另一端,例如 0 1 2 3 4 5 6 4 5 6 0 1 2 3 二 使用暴力的方式就是遍歷這個陣...

旋轉陣列的最小值

題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...