解答

Leetcode上第605道题,我的解答:线下编译没错误,但是线上编译出错

  1. #include <iostream>
  2. #include<vector>
  3. using std::vector;
  4. using std::cout;
  5. using std::endl;
  6. class Solution
  7. {
  8. public:
  9. int num_flag = 0;
  10. bool canPlaceFlowers(vector<int>& flowerbed, int n)
  11. {
  12. for (auto it = flowerbed.begin(); it != flowerbed.end(); ++it)
  13. {
  14. if (it == flowerbed.begin() || it == flowerbed.end())
  15. {
  16. if (it == flowerbed.begin())
  17. {
  18. if (*it==0 && *(it + 1) == 0)
  19. {
  20. *it = 1;
  21. num_flag = num_flag + 1;
  22. }
  23. }
  24. else
  25. {
  26. if (*it==0 && *(it - 1) == 0)
  27. {
  28. *it = 1;
  29. num_flag = num_flag + 1;
  30. }
  31. }
  32. }
  33. else
  34. {
  35. if (*(it - 1) == 0 && *it == 0 && *(it + 1) == 0)
  36. {
  37. *it = 1;
  38. num_flag = num_flag + 1;
  39. }
  40. }
  41. }
  42. if (num_flag >= n) {
  43. return true;
  44. }
  45. else {
  46. return false;
  47. }
  48. };
  49. };
  50. void main()
  51. {
  52. vector<int> flbed = { 1,0,0,0,1,0,0};
  53. int n = 2;
  54. Solution solu;
  55. bool result = solu.canPlaceFlowers(flbed, n);
  56. if (result)
  57. {
  58. cout << "可以" << endl;
  59. }
  60. else
  61. {
  62. cout << "不可以" << endl;
  63. }
  64. }

跳格子法

解题者提供的跳格子法,非常容易理解

题目要求是否能在不打破规则的情况下插入n朵花,与直接计算不同,采用“跳格子”的解法只需遍历不到一遍数组,处理以下两种不同的情况即可:

【1】当遍历到index遇到1时,说明这个位置有花,那必然从index+2的位置才有可能种花,因此当碰到1时直接跳过下一格。
【2】当遍历到index遇到0时,由于每次碰到1都是跳两格,因此前一格必定是0,此时只需要判断下一格是不是1即可得出index这一格能不能种花,如果能种则令n减一,然后这个位置就按照遇到1时处理,即跳两格;如果index的后一格是1,说明这个位置不能种花且之后两格也不可能种花(参照【1】),直接跳过3格。

当n减为0时,说明可以种入n朵花,则可以直接退出遍历返回true;如果遍历结束n没有减到0,说明最多种入的花的数量小于n,则返回false。