I wrote the following code to find the median of two sorted arrays and it runs fine locally, but when I submit to leetcode I get runtime error: addition of unsigned offset (stl_vector.h)
here's the code:
#include <bits/stdc++.h>
using namespace std;
class Solution {
double findMedian(vector<int> &nums, int begin, int end){
int middle = (begin+end)/2;
return (end - begin + 1) %2 == 0 ? \
((double)nums[middle] + (double)nums[middle+1])/2.0 \
: nums[middle];
}
double divConq(vector<int>& input1, vector<int>& input2,\
int s1, int e1, int s2, int e2){
int len1 = e1 - s1 + 1;
int len2 = e2 - s2 + 1;
//cout << "length len1: " << len1 << " length len2: " << len2 << '\n';
//nums1 always longer
vector<int>& nums1 = len1 >= len2 ? input1 : input2;
vector<int>& nums2 = len1 >= len2 ? input2 : input1;
if (nums1 != input1){swap(s1, s2); swap(e1, e2);}
double med1 = findMedian(nums1, s1, e1);
double med2 = findMedian(nums2, s2, e2);
//trivial cases
if(len1 == 0){return med2;}
if(len2 == 0){return med1;}
//base case with list of length 1
if(len1 == 1 && len2 == 1){return (med1 + med2)/2.0;}
if(len2 == 1){
int windowIndexLow = len1 %2 == 0? ((s1+e1)/2)-1 : ((s1+e1)/2);
int windowIndexHigh = len1 % 2 == 0? windowIndexLow + 2 : windowIndexLow + 1;
//cout << "length of nums2 is 1" << '\n';
if(len1 % 2 == 0){
if(med2 >= nums1[windowIndexLow] && med2 <= nums1[windowIndexHigh]){
return ((double)(med2 + med1)) / 2.0;
}
else if(med2 > windowIndexHigh){
return findMedian(nums1, s1+1, e1);
}
else if(med2 < windowIndexLow){
return findMedian(nums1, s1, e1-1);
}
}
else{
if(med2 >= nums1[windowIndexLow] && med2 <= nums1[windowIndexHigh]){
return med2;
}
else if(med2 > windowIndexHigh){
return findMedian(nums1, s1+1, e1);
}
else if(med2 < windowIndexLow){
return findMedian(nums1, s1, e1-1);
}
return -1.0;
}
}
//base case with lists of length 2
if(len2 == 2 && len1 == 2){
return (max(nums1[0], nums2[0]) + \
min(nums1[1], nums2[1]))/2.0;
}
//case 1.1: delete top half of nums1 and some of nums2
if(len1 <= len2 && med1 >= med2){
int cut = (len1)/2;
return divConq(nums1, nums2, s1, e1-cut, s2+cut, e2);
}
//case 1.2: delete bottom half of nums1 and some of nums2
if(len1 <= len2 && med1 <= med2){
int cut = (len1)/2;
return divConq(nums1, nums2, s1+cut, e1, s2, e2-cut);
}
//case 1.3: delete top half of nums2 and some of nums1
if(len1 >= len2 && med2 >= med1){
int cut = (len2)/2;
return divConq(nums1, nums2, s1+cut, e1, s2, e2-cut);
}
//case 1.4: delete bottom half of nums2 and some of nums1
if(len1 >= len2 && med2 <= med1){
int cut = (len2)/2;
return divConq(nums1, nums2, s1, e1-cut, s2+cut, e2);
}
return -1.0;
}
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
return divConq(nums1, nums2, 0, (int)nums1.size() - 1, 0, (int)nums2.size() - 1);
}
};
Does anyone know why this would be the case and what I can do to fix this submission?
I ran my code locally, word for word identical on the g++ compiler and it works for every test case. I have searched online for this issue and don't see any similar complaints that have been satisfactorily answered. I checked the official solutions but my solutions seems much neater and cleaner and it seems to me like I am respecting the vector structure. Please can someone help me fix this issue?