No. 24 - Intersection of Sorted Arrays

No. 24 - Intersection of Sorted Arrays

 

Problem: Please implement a function which getsthe intersection of two sorted arrays. Assuming numbers in each array areunique.

 

For example, ifthe two sorted arrays as input are {1, 4, 7, 10, 13} and {1, 3, 5, 7, 9}, itreturns an intersection array with numbers {1, 7}.

 

Analysis: An intuitive solution for this problemis to check whether every number in the first array (denoted as array1) is in the second array (denoted as array2). If the length of array1 is m, and the length of array2 is n, its overall time complexity is O(m*n)based on linear search. We have two better solutions.

 

Solution 1: With O(m+n) Time

 

It is noticeablethat the two input arrays are sorted. Supposing a number number1 in array1equals to a number number2 in array2, the numbers after number1 in array1 should be greater than the numbersbefore number2 in array2. Therefore, it is not necessary tocompare the numbers after number1 in array1 with numbers before number2 in array2. It improves efficiency since manycomparisons are eliminated.

 

The sample codefor this solution is shown below:

 

void GetIntersection_solution1(const vector<int>& array1,

                     const vector<int>& array2,

                    vector<int>& intersection)

{

   vector<int>::const_iterator iter1 =array1.begin();

   vector<int>::const_iterator iter2 =array2.begin();

 

   intersection.clear();

 

    while(iter1 != array1.end() && iter2 !=array2.end())

   {

        if(*iter1 == *iter2)

       {

           intersection.push_back(*iter1);

           ++ iter1;

           ++ iter2;

       }

        else if(*iter1 < *iter2)

           ++ iter1;

        else

           ++ iter2;

   }

}

 

Since it onlyrequires to scan two arrays once, its time complexity is O(m+n).

 

Solution 2: With O(nlogm) Time

 

As we know, abinary search algorithm requires O(logm) time to find a number in anarray with length m. Therefore, if we search each number of an array withlength n from an array with lengthm, itsoverall time complexity is O(nlogm). If m is much greater than n, O(nlogm) is actuallyless than O(m+n). Therefore, we can implement a new and bettersolution based on binary search in such a situation. 

 

For instance,the following same code is suitable when array1 is much longer than array2.

 

/* === Supposingarray1 is much longer than array2 === */

void GetIntersection_solution2(const vector<int>& array1,

                     const vector<int>& array2,

                    vector<int>& intersection)

{

   intersection.clear();

   

   vector<int>::const_iterator iter1 =array1.begin();

    while(iter1 != array1.end())

   {

        if(binary_search(array2.begin(), array2.end(), *iter1))

           intersection.push_back(*iter1);

   }

}

 

The author Harry Heowns all the rights of this post. If you are going to use part of or the wholeof this ariticle in your blog or webpages,  please add a reference to   http://codercareer.blogspot.com/ . If you are going to use it in your books,please contact me (zhedahht@gmail.com) . Thanks.
这段代码可以加上以下保护措施: 1. 输入点坐标进行有效性检查,确保输入的点是合法的,例如可以加上对输入的点是否为空的判断。 2. 在计算斜率和截距之前,需要判断两个点的横坐标是否相等,如果相等则说明该条线段是竖直的,此时无法计算斜率,需要特殊处理。 3. 在计算交点的横坐标之后,需要判断计算出的交点是否在两条线段的范围内,只有在交点在两条线段的范围内时,才认为两条线段相交。 4. 最后,需要在函数中返回一个有效的值,而不是无意义的值。可以创建一个 Point 类型的变量,存储计算出的交点坐标,并将其作为函数的返回值。 修改后的代码: ```cpp // 定义 Point 类型 class Point { public: double x; double y; Point(double x = 0, double y = 0) : x(x), y(y) {} }; // 计算两条线段的交点坐标 Point intersection(Point p1, Point p2, Point p3, Point p4) { // 输入点坐标有效性检查 if (p1.x == p2.x && p1.y == p2.y || p3.x == p4.x && p3.y == p4.y) { cout << "输入点坐标无效" << endl; return Point(); // 返回无意义的值 } // 计算第一条线段的斜率和截距 double k1 = (p1.x == p2.x) ? INT_MAX : (p1.y - p2.y) / (p1.x - p2.x); double b1 = p1.y - k1 * p1.x; // 计算第二条线段的斜率和截距 double k2 = (p3.x == p4.x) ? INT_MAX : (p3.y - p4.y) / (p3.x - p4.x); double b2 = p3.y - k2 * p3.x; // 判断两条线段是否平行 if (k1 == k2) { cout << "两条线段平行" << endl; return Point(); // 返回无意义的值 } // 计算交点的横坐标 double x = (b2 - b1) / (k1 - k2); // 判断交点是否在两条线段的范围内 if (x < min(p1.x, p2.x) || x > max(p1.x, p2.x) || x < min(p3.x, p4.x) || x > max(p3.x, p4.x)) { cout << "两条线段不相交" << endl; return Point(); // 返回无意义的值 } // 计算交点的纵坐标 double y = k1 * x + b1; // 返回交点坐标 return Point(x, y); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值