實作樓上各位的「梯形演算法」如下
#include <stdio.h>
int main()
{
int arr[] = {2,3,5,6,7,8};
size_t sz = sizeof(arr) / sizeof(int);
int answer, sum=0;
int topline=sz, baseline=0, height=sz+1;
//找出上底和下底,順便把所有值加起來
for (int i=0;i<sz;i++) {
if (arr[i]<topline) { topline = arr[i]; }
if (arr[i]>baseline) { baseline = arr[i]; }
sum = sum + arr[i];
}
answer = (topline+baseline)*height/2 - sum;
printf("The answer is %d.\n", answer);
return 0;
}
其實說真的。如果要for的話。
就直接用for找出來就好了。
不用這樣計算才對的。
我是依不用for來想的。
要for的話就很簡單了。
謝謝!!我看好久><(程式真的不熟!)
但中間那邊不太了解:
for (int i=0;i<asize;i++) {
arrB[value2index(arr[i])] = arr[i];
這邊的處理是怎麼做到-1就是缺項的,
是指index再指向arrayB,對應arrayA的缺項嗎?
一次回覆兩位
我已經改答案了
原本那個(空間複雜度)O(2n) 的程式
就算了
XDDD謝謝你!!!
利用陣列長度算加總(梯形公式),在減去陣列裡存在的元素
已經連續整數就不需要再排序了吧?
for (int i = 0; i < array.length; i++) {
if (array[i] + 1 != array[i+1]) {
value = array[i] + 1;
}
}
感覺至少還是要O(n)
(最小值+最大值)*(最大值-最小值+1)/2 - 目前陣列總合
依你的例子
(2+8)*(8-2+1)/2 - (2+3+5+6+7+8)
10*7/2 - 31
35 -31
= 4
不過這只適合缺一個。缺2個以上,就得用其它算法了
之前有學過,好像要用一下三角函數還是對數??
只是一時之間想不起來了。