大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.3 KiB

  1. // 接雨水问题
  2. #include<iostream>
  3. using namespace std;
  4. /*
  5. *
  6. */
  7. int JieYuShui1(int height[], int len){
  8. int res = 0;
  9. // 遍历每个柱子
  10. for (int i = 1; i < len - 1; i++) {
  11. int leftMax = 0, rightMax = 0;
  12. // 计算当前柱子左侧的柱子中的最大高度
  13. for (int j = 0; j <= i; j++) {
  14. leftMax = max(leftMax, height[j]);
  15. }
  16. // 计算当前柱子右侧的柱子中的最大高度
  17. for (int j = i; j < len; j++) {
  18. rightMax = max(rightMax, height[j]);
  19. }
  20. // 结果中累加当前柱子顶部可以储水的高度,
  21. // 即 当前柱子左右两边最大高度的较小者 - 当前柱子的高度。
  22. res += min(leftMax, rightMax) - height[i];
  23. }
  24. return res;
  25. }
  26. /*
  27. *DP
  28. 1dp数组 int[][] dp = new int[n][2]dp[i][0] i的柱子左边的最大值dp[i][1] i的柱子右边的最大值2height数组 dp[i][0] dp[i][1] 31
  29. */
  30. int JieYuShui2(int height[], int len){
  31. int res = 0;
  32. if (len == 0) {
  33. return 0;
  34. }
  35. // 定义二维dp数组
  36. // dp[i][0] 表示下标i的柱子左边的最大值
  37. // dp[i][1] 表示下标i的柱子右边的最大值
  38. int dp[len][2];
  39. dp[0][0] = height[0];
  40. dp[len - 1][1] = height[len - 1];
  41. for (int i = 1; i < len; i++) {
  42. dp[i][0] = max(height[i], dp[i - 1][0]);
  43. }
  44. for (int i = len - 2; i >= 0; i--) {
  45. dp[i][1] = max(height[i], dp[i + 1][1]);
  46. }
  47. // 遍历每个柱子,累加当前柱子顶部可以储水的高度,
  48. // 即 当前柱子左右两边最大高度的较小者 - 当前柱子的高度。
  49. for (int i = 1; i < len - 1; i++) {
  50. res += min(dp[i][0], dp[i][1]) - height[i];
  51. }
  52. return res;
  53. }
  54. /*
  55. * dp[i][0] dp[i][1] int leftMax int rightMax
  56. */
  57. int JieYuShui3(int height[], int len){
  58. int res = 0;
  59. int leftMax = 0, rightMax = 0, left = 0, right = len - 1;
  60. while (left <= right) {
  61. if (leftMax <= rightMax) {
  62. leftMax = max(leftMax, height[left]);
  63. res += leftMax - height[left++];
  64. } else {
  65. rightMax = max(rightMax, height[right]);
  66. res += rightMax - height[right--];
  67. }
  68. }
  69. return res;
  70. }
  71. int main(){
  72. int arr[] = {0,1,0,2,1,0,1,3,2,1,2,1};
  73. int len = sizeof(arr) / sizeof(arr[0]);
  74. int res = JieYuShui3(arr, len);
  75. cout<<res<<endl;
  76. return 0;
  77. }