力扣算法题—042接雨水
Posted zzw1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣算法题—042接雨水相关的知识,希望对你有一定的参考价值。
1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class Solution { 8 public: 9 int trap(vector<int>& height) { 10 if (height.size() < 2)return 0; 11 int s = 0;//起始点 12 int e = 0;//终止点 13 int v = 0;//接雨水量 14 int t = 0;//计算中间掠过的柱子 15 int i, j; 16 for (i = 0; i < height.size()-1; ++i) { 17 if (height[i] < 1)continue; 18 s = height[i];//找到非0点为起始点 19 for (j = i + 1; j < height.size(); ++j) { 20 if (height[j] >= s) {//找到比起始点大或者相等的点 21 e = height[j]; 22 break; 23 } 24 t += height[j]; 25 if (j == height.size() - 1) {//没有比起始点小的数了 26 --s;//对s进行降高度 27 j = i;//重新遍历 28 t = 0;//重新计算中间掠过的柱子 29 } 30 } 31 v += (s < e ? s : e)*(j - i - 1) - t;//计算体积,记得减去中间的掠过体积 32 t = 0;//下一步重新计算掠过的体积 33 i = j - 1;//换过起始点(即终止点作为新的起始点) 34 } 35 return v; 36 } 37 }; 38 39 //下面是看够力扣题解之后的答案 40 //根据力扣上面的解题提示 41 //尝试着做一下 42 //使用暴力法进行解答 43 //484ms 44 class Solution { 45 public: 46 int trap(vector<int>& height) { 47 int ans = 0; 48 int size = height.size(); 49 for (int i = 1; i < size - 1; i++) { 50 int max_left = 0, max_right = 0; 51 for (int j = i; j >= 0; j--) { //Search the left part for max bar size 52 max_left = max(max_left, height[j]); 53 } 54 for (int j = i; j < size; j++) { //Search the right part for max bar size 55 max_right = max(max_right, height[j]); 56 } 57 ans += min(max_left, max_right) - height[i]; 58 } 59 return ans; 60 } 61 }; 62 // 63 // 64 //使用动态规划20ms 65 // 66 class Solution { 67 public: 68 int trap(vector<int>& height) { 69 if (height.size() == NULL)return 0; 70 int ans = 0; 71 int size = height.size(); 72 vector<int> left_max(size), right_max(size); 73 left_max[0] = height[0]; 74 for (int i = 1; i < size; i++) { 75 left_max[i] = max(height[i], left_max[i - 1]); 76 } 77 right_max[size - 1] = height[size - 1]; 78 for (int i = size - 2; i >= 0; i--) { 79 right_max[i] = max(height[i], right_max[i + 1]); 80 } 81 for (int i = 1; i < size - 1; i++) { 82 ans += min(left_max[i], right_max[i]) - height[i]; 83 } 84 return ans; 85 } 86 }; 87 // 88 // 89 //使用堆栈法28ms 90 // 91 class Solution { 92 public: 93 int trap(vector<int>& height) { 94 int ans = 0, current = 0; 95 stack<int> st; 96 while (current < height.size()) { 97 while (!st.empty() && height[current] > height[st.top()]) { 98 int top = st.top(); 99 st.pop(); 100 if (st.empty()) 101 break; 102 int distance = current - st.top() - 1; 103 int bounded_height = min(height[current], height[st.top()]) - height[top]; 104 ans += distance * bounded_height; 105 } 106 st.push(current++); 107 } 108 return ans; 109 } 110 }; 111 // 112 //使用双指针法16ms 113 // 114 class Solution { 115 public: 116 int trap(vector<int>& height) { 117 int left = 0, right = height.size() - 1; 118 int ans = 0; 119 int left_max = 0, right_max = 0; 120 while (left < right) { 121 if (height[left] < height[right]) { 122 height[left] >= left_max ? (left_max = height[left]) : ans += (left_max - height[left]); 123 ++left; 124 } 125 else { 126 height[right] >= right_max ? (right_max = height[right]) : ans += (right_max - height[right]); 127 --right; 128 } 129 } 130 return ans; 131 } 132 }; 133 134 135 void T042() { 136 Solution s; 137 vector<int>v; 138 v = { 0,1,0,2,1,0,1,3,2,1,2,1 }; 139 cout << s.trap(v) << endl; 140 v = { 4,2,1,2,4 }; 141 cout << s.trap(v) << endl; 142 v = { 0,4,0,3,0,2}; 143 cout << s.trap(v) << endl; 144 145 146 }
以上是关于力扣算法题—042接雨水的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解
❤️思维导图整理大厂面试高频数组12: 4种方法彻底解决接雨水问题, 力扣42❤️