C++ 接雨水,不看后悔系列,解一道高频面试题
Posted 灯火阑处
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 接雨水,不看后悔系列,解一道高频面试题相关的知识,希望对你有一定的参考价值。
这是一道同事讨论过的一道趣味题,综合了比较多的解题思想,其中有二分,递归,分治等思想。闲来抽空实现了下,如有错误请多多指出,或者有优化处请多多指出。逻辑不是很复杂,直接上代码吧。
//
// main.cpp
// 面试题经典
//
// Created by 于磊 on 2020/5/27.
// Copyright © 2020 于磊. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef vector<int>::const_iterator c_iter;
int Area = 0;
size_t Max(c_iter begin,c_iter end,const vector<int> water)
return *max_element(begin, end);
size_t MaxIndex(c_iter begin,c_iter end,const vector<int> water)
return max_element(begin,end) - begin;
int getAreaL(c_iter _begin,c_iter _end,const vector<int> _water )
if (_begin == _end)
return 0;
size_t _idx = MaxIndex(_begin, _end,_water);
size_t _max = Max(_begin, _end,_water);
if (_idx>0)
getAreaL(_begin, _begin +_idx, _water);
while (_begin+_idx!=_end)
Area+=_max-*(_begin++ +_idx);
return 0;
int getAreaR(c_iter _begin,c_iter _end,const vector<int> _water )
if ( _begin-1 == _end )
return 0;
size_t _idx = MaxIndex(_begin, _end,_water);
size_t _max = Max(_begin, _end,_water);
auto maxIdx =_begin+_idx+1;
if ( _idx<_end-_begin-1)
getAreaR(maxIdx, _end, _water);
while (_begin!=maxIdx)
Area+=_max-*(_begin++);
return 0;
int main(int argc, const char * argv[])
vector<int> water;
int i;
std::cout << "please input number of water container end of by #\\n";
while (cin >> i && i != '#')
water.push_back(i);
size_t _idx = MaxIndex(water.begin(), water.end(),water);
getAreaL(water.begin(), water.begin()+_idx, water);
getAreaR(water.begin()+_idx, water.end(), water);
cout<<"总共装水 "<<Area<<endl;
return 0;
以上是关于C++ 接雨水,不看后悔系列,解一道高频面试题的主要内容,如果未能解决你的问题,请参考以下文章
❤️思维导图整理大厂面试高频数组12: 4种方法彻底解决接雨水问题, 力扣42❤️