递归查找整数向量中最小正整数的函数实现问题
完善递归查找最小正整数的函数
先看看你写的不完整代码片段:
#include <vector> using namespace std; int rec_min_pos(const vector<int> & nums, int size) { if (size < 1) { return -1; } else { int min = rec_min_pos(nums, size - 1); if(min < 0){ if(nums[size - 1] <= 0){ return -1; }else{ return nums[size-1]; } }else { if (min < nums[size - 1]) { return min; } else { return nums[size -... } } }
你的核心逻辑方向是对的,但在处理当前元素为非正整数的情况时遗漏了分支,而且比较前没判断当前元素是否是正整数(如果当前元素是负数,没必要和已有的最小正整数比较)。下面是完整的修正版代码:
#include <vector> using namespace std; int rec_min_pos(const vector<int>& nums, int size) { // 基线条件:没有元素时返回-1(表示无正整数) if (size < 1) { return -1; } // 递归查找前size-1个元素的最小正整数 int prev_min = rec_min_pos(nums, size - 1); // 当前待检查的元素(注意vector下标从0开始) int current = nums[size - 1]; // 情况1:前面的元素里没有正整数 if (prev_min < 0) { return current > 0 ? current : -1; } // 情况2:前面已经找到最小正整数 else { // 如果当前元素是正整数,就和前面的最小值比较取更小的 if (current > 0) { return min(prev_min, current); } // 如果当前元素是非正的,直接返回前面的最小值即可 else { return prev_min; } } }
关键逻辑解释:
- 基线条件:当
size小于1时,说明没有元素需要检查,返回-1作为“无正整数”的标记 - 递归拆解:每次只处理最后一个元素,把前面的元素交给递归调用处理
- 分支处理:
- 若前面没有找到正整数,只需要判断当前元素是否为正,是则返回它,否则继续返回-1
- 若前面已经有最小正整数,只有当前元素是正整数时才需要比较,非正元素直接忽略
测试案例参考:
- 输入
nums = {-5, 3, 2, -1},调用rec_min_pos(nums, 4),返回2 - 输入
nums = {-3, -1, -7},调用rec_min_pos(nums, 3),返回-1 - 输入
nums = {5},调用rec_min_pos(nums, 1),返回5
内容的提问来源于stack exchange,提问作者Florian Humblot
相关产品推荐
相关产品推荐

