程式設計之美 滿足條件的兩個數字及擴充套件問題

2021-07-11 18:59:27 字數 1418 閱讀 8494

問題描述: 對應函式 find_two

快速找出陣列中的兩個數字,讓這兩個數字之和等於給定的數字。

想法:

如果把任意兩個數字組合進行嘗試的話,運算量是n*n不適合。

先將陣列進行排序,然後從兩頭分別取數字進行組合,如果和大於目標數字則在大數字側找下乙個稍小一點的數字。

如果和小於目標數字則在小數字側找下乙個稍大一點的數字

擴充套件問題 1:  對應函式 find_three

快速找出陣列中的三個數字,讓這兩個數字之和等於給定的數字。

擴充套件問題 2:  對應函式 find_three_near

快速找出陣列中的三個數字,讓這兩個數字之和等於給定的數字或找到最接近的解。

想法:

想法與找兩個數字類似,先找到一大一小的兩個終點,然後用游標在這兩個終點間進行遍歷,尋找第三個數,使他們的和接近或等於目標數字。

#include #include using namespace std;

void swap(int &a, int &b)

void quick_sort(int* parr, int lpos, int rpos)

if ((parr[j] > mid_val) && (i < j))

if (i < j)

}mid_pos = j;

quick_sort(parr, lpos, mid_pos);

quick_sort(parr, mid_pos+1, rpos);

}bool find_two(int arr, int len, int num)

if (result)

cout << num << " = " << arr[i] << " + " << arr[j] << endl;

else

cout << "none" << endl;

return result;

}bool find_three(int arr, int len, int num)

}j--;

}if (bfound)

cout << endl;

}else

cout << "none" << endl;

return bfound;

}bool find_three_near(int arr, int len, int num)

else if (min > abs((sum + arr[curr] - num)))

}j--;

}if (!bfound)

cout << "not found near value=" << min <> len;

}

程式設計之美 尋找滿足條件的兩個數

方法一 直接兩層迴圈 o n n find sum.cpp 定義控制台應用程式的入口點。include stdafx.h include void find sum int a,int n int sum,int first,int second return false int tmain int...

快速尋找滿足條件的兩個數(程式設計之美)

快速找出乙個陣列中的兩個數,讓此兩個數之和等於乙個給定的數。如 5 6 1 4 7 9 8 中找出兩個數之和等於10的數 程式設計之美之美p177有詳細解答過程,思路是先排序 o nlog n 然後儲存兩個指標beg end,初始指向頭部和尾部,如過 beg end sum,則返回 如果 beg e...

程式設計之美 快速尋找滿足條件的兩個數

能否快速找出乙個陣列中的兩個數字,讓這兩個數字之和等於乙個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。法一 最直接的方法就是,窮舉法,複雜度為o n 2 法二 利用sum減去a i 再查詢sum a i 是否在陣列裡,這時候就變成查詢了,可利用二分查詢 排序的複雜度為o ...