我正在编写用于在旋转的排序数组中查找最小元素的递归解决方案。函数的输入是const向量,我必须获得递归的子数组。
var itemHeight = $('.item').height();
$('.item').each(function() {
$(this).css({
height: itemHeight + 'px'
});
});
$(window).on('resize', function(event) {
$('.item').each(function() {
$(this).css({
height: itemHeight + 'px'
});
});
});
错误是关于子矢量B和C
答案 0 :(得分:2)
向量存储和拥有数据,它们不是对它的视图。向量没有“子向量”,因为没有其他对象拥有向量的数据。
您可以将数据从向量复制到另一个向量,但调用“子向量”会产生误导。
最简单的解决方案是重写函数以使用迭代器开始和结束而不是容器。您可以使用现有的接口,并让它调用双迭代器版本来维护API。
更难的解决方案是编写一个存储两个array_view<T>
的{{1}}类,其行为类似于您想要的接口范围,包括隐式的矢量转换。使用正确编写的T*
以及const vector<int>&B
替换您的C
和类似array_view<int const> B
,并且(假设您的代码中没有其他错误)您已完成。
答案 1 :(得分:2)
const vector<int> &C(&A[m+1],&A[r]);
您在此处遇到的错误是您尝试绑定引用,但您正在使用语法初始化向量。
获取子矢量的正确方法是
const vector<int> C(&A[m+1],&A[r]);
注意缺少的&
。然而,这将是给定范围的副本,这是不合需要的。
正如上面的评论中所建议的那样,将函数参数更改为向量和几个索引,或者(或许更好)将其作为几个迭代器。
答案 2 :(得分:0)
对于这种类型的递归函数,使用辅助函数会更合适,如下所示:
int findMinHelper(std::vector<int> const& rotatedSorted, int left, int right)
{
if (right == left) return rotatedSorted[left];
int mid = (right + left) / 2;
if (mid < right && rotatedSorted[mid + 1] < rotatedSorted[mid])
return rotatedSorted[mid + 1];
if (mid > left && rotatedSorted[mid] < rotatedSorted[mid - 1])
return rotatedSorted[mid];
if (rotatedSorted[right] > rotatedSorted[mid])
return findMinHelper(rotatedSorted, left, mid - 1);
return findMinHelper(rotatedSorted, mid + 1, right);
}
int findMin(std::vector<int> const& rotatedSorted)
{
// proper handling of the case when rotatedSorted.empty() is true
// must be done
return findMinHelper(rotatedSorted, 0, rotatedSorted.size() - 1);
}
然后,您可以致电:
std::vector<int> input{10, 21, 4, 5, 8};
int minValue = findMin(input);
std::cout << minValue << std::endl;
将按预期打印4。