快速寻找满足条件的两个数(两数之和为给定值)
2012-02-08 10:32
381 查看
首先递增排序,首尾指针相加,大于目标数,尾指针前移,小于目标数,首指针后移,继续比较,直到两指针相遇。
程序如下,借用这个问题,练习一下MergeSort
程序如下,借用这个问题,练习一下MergeSort
#include <stdio.h> #include <boost/scoped_ptr.hpp> void FindTargetSum(int array[], int begin, int end, int target_value) { int min = begin; int max = end; int sum; while (min < max) { sum = array[min] + array[max]; if (sum > target_value) { max--; } else if (sum < target_value) { min++; } else { printf("%d %d\n", array[min], array[max]); FindTargetSum(array, min - 1, max - 1, target_value); break; } } } template<typename T> void Merge(T array[], int begin, int middle, int end) { int length1 = middle - begin + 1; int length2 = end - middle; boost::scoped_ptr<T> first_array_buffer(new T[length1]); T* first = first_array_buffer.get(); boost::scoped_ptr<T> second_array_buffer(new T[length2]); T* second = second_array_buffer.get(); for (int i = 0; i < length1; ++i) { first[i] = array[begin + i]; } for (int i = 0; i < length2; ++i) { second[i] = array[middle + 1 + i]; } int pos1 = 0; int pos2 = 0; int pos = begin; while (pos1 < length1 || pos2 < length2) { if (pos1 < length1 && pos2 < length2) { if (first[pos1] < second[pos2]) { array[pos++] = first[pos1++]; } else { array[pos++] = second[pos2++]; } } else if (pos1 < length1) { array[pos++] = first[pos1++]; } else { array[pos++] = second[pos2++]; } } } template<typename T> void MergeSort(T array[], int begin, int end) { if (begin < end) { int middle = (begin + end ) / 2; // int middle1 = begin + (end - begin + 1) / 2; // printf("--middle:%d, middle1:%d\n", middle, middle1); MergeSort(array, begin, middle); MergeSort(array, middle + 1, end); Merge(array, begin, middle, end); } } template<typename T> void Merge1(T array[], int begin, int middle, int end) { int length1 = middle - 1 - begin + 1; int length2 = end - middle + 1; boost::scoped_ptr<T> first_buffer(new T[length1]); T* first = first_buffer.get(); boost::scoped_ptr<T> second_buffer(new T[length2]); T* second = second_buffer.get(); for (int i = 0; i < length1; ++i) { first[i] = array[begin + i]; } for (int i = 0; i < length2; ++i) { second[i] = array[middle + i]; } int pos = begin; int pos1 = 0; int pos2 = 0; while (pos1 < length1 || pos2 < length2) { if (pos1 < length1 && pos2 < length2) { if(first[pos1] < second[pos2]) { array[pos++] = first[pos1++]; } else { array[pos++] = second[pos2++]; } } else if (pos1 < length1) { array[pos++] = first[pos1++]; } else { array[pos++] = second[pos2++]; } } } template<typename T> void MergeSort1(T array[], int begin, int end) { if (begin < end) { int middle = begin + (end - begin + 1) / 2; MergeSort1(array, begin, middle - 1); MergeSort1(array, middle, end); Merge1(array, begin, middle, end); } } int main(int argc, char** argv) { int array[] = {1, 5, 4, 7, 8 ,10}; size_t array_size = sizeof(array) / sizeof(int); MergeSort1(array, 0, array_size - 1); for (int i = 0; i < array_size; ++i) { printf("%d ", array[i]); } printf("\n"); FindTargetSum(array, 0, array_size - 1, 15); }
相关文章推荐
- 编程之美2.12——快速寻找满足条件的两个数或三个数
- 编程之美2.12——快速寻找满足条件的两个数或三个数
- 每日一题(24) - 快速寻找满足条件的两个数
- 编程之美2.12 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- [编程之美] PSet2.12 快速寻找满足条件的两个数
- 【扩展】快速寻找满足条件(两个数的和为指定值)的两个数
- 快速寻找满足条件的两个数
- 数字之魅:快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 编程之美之快速寻找多个数满足给定条件
- 快速寻找满足条件的两个数
- 编程之美2.12 快速寻找满足条件的两个数
- 微软面试题:快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 编程之美2.12—快速寻找满足条件的两个数
- [编程之美2.12]快速寻找满足条件的两个数及leetcode的3 sum closest 和 4 sum解析
- (1.5.2.11)快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数