力扣算法题—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 }

 

转载于:https://www.cnblogs.com/zzw1024/p/10578399.html

<think>嗯,用户想要整合力扣热门算法题中的英语算法词汇。首先,我需要确定用户的需求是什么。可能用户正在准备面试或者刷题,需要熟悉常见的英语算法术语,方便阅读题目或者国际交流。 下来,我得回忆一下力扣上常见的算法题类型,比如数组、链表、树、图这些数据结构相关的题目。然后每个数据结构下常用的算法,比如数组里的双指针、滑动窗口;树里的遍历方式,DFS、BFS等等。 另外,动态规划、贪心算法这些高频考点肯定不能少。还有一些特定的算法名称,比如Dijkstra算法、KMP算法,这些都是经常出现的英语词汇。 然后要考虑用户可能需要中英文对照,这样他们看到英文术语时能对应到中文概念。比如Binary Search对应二分查找,Backtracking对应回溯算法。 还要注意一些容易混淆的术语,比如“Topological Sort”是拓扑排序,“Sliding Window”是滑动窗口,这些需要准确对应。另外,排序算法里的Quick Sort、Merge Sort,查找算法里的BFS、DFS,都是必须包括的。 可能用户还需要了解一些特定的问题名称,比如Two Sum(两数之和)或者N-Queens(N皇后问题),这些题目在力扣上非常经典,英语名称也经常被提到。 需要确保覆盖全面,分门别类,比如数据结构算法分类、经典问题、技术概念等,这样用户查阅起来更方便。同时,每个类别下举出足够的例子,帮助用户记忆和理解。 最后,检查是否有遗漏的重要术语,比如最近比较热门的算法或者新加入力扣的题目相关词汇。确保信息准确,没有拼写错误,比如Dijkstra的正确拼写,以及各种算法名称的首字母大写。 总结一下,应该分成几个大类,每个类别下列出中英文对照,并简要说明应用场景或例子,这样用户能快速查找和复习。同时,提醒用户结合题目练习来巩固这些术语,这样效果会更好。</think>### 力扣热门算法题高频英语词汇整合(中英对照) --- #### **一、数据结构相关** | **英文术语** | **中文翻译** | **典型应用场景/示例** | |----------------------|--------------------|-------------------------------------| | Array | 数组 | Two Sum, Majority Element | | Linked List | 链表 | Reverse Linked List, Merge Two Lists | | Stack | 栈 | Valid Parentheses, Min Stack | | Queue | 队列 | BFS, Sliding Window Maximum | | Tree | 树 | Binary Tree Traversal, BST Validation | | Graph | 图 | Shortest Path, Topological Sorting | | Heap/Priority Queue | 堆/优先队列 | Merge k Sorted Lists, Top K Elements | | Hash Table | 哈希表 | Subarray Sum, Two Sum | | Trie | 字典树 | Word Search, Autocomplete System | --- #### **二、算法分类** | **英文术语** | **中文翻译** | **典型题目** | |---------------------------|----------------------|---------------------------------------| | Two Pointers | 双指针 | Container With Most Water, 3Sum | | Sliding Window | 滑动窗口 | Longest Substring Without Repeating Characters | | Binary Search | 二分查找 | Search in Rotated Sorted Array | | Depth-First Search (DFS) | 深度优先搜索 | Permutations, N-Queens | | Breadth-First Search (BFS)| 广度优先搜索 | Word Ladder, Level Order Traversal | | Dynamic Programming (DP) | 动态规划 | Climbing Stairs, Longest Common Subsequence | | Backtracking | 回溯算法 | Subsets, Sudoku Solver | | Greedy Algorithm | 贪心算法 | Jump Game, Task Scheduler | | Divide and Conquer | 分治法 | Merge Sort, Maximum Subarray | | Topological Sorting | 拓扑排序 | Course Schedule, Alien Dictionary | --- #### **三、经典问题名称** | **英文题目名** | **中文翻译** | **核心考点** | |-------------------------------|---------------------------|---------------------------------------| | Two Sum | 两数之和 | 哈希表、双指针 | | Merge Intervals | 合并区间 | 排序、区间操作 | | Trapping Rain Water | 雨水 | 双指针、动态规划 | | Longest Palindromic Substring | 最长回文子串 | 中心扩展法、动态规划 | | N-Queens | N皇后问题 | 回溯算法 | | Word Break | 单词拆分 | 动态规划 | | Edit Distance | 编辑距离 | 动态规划 | | Knapsack Problem | 背包问题 | 动态规划 | | Dijkstra's Algorithm | 迪杰斯特拉算法 | 最短路径(带权图) | | Kruskal's Algorithm | 克鲁斯卡尔算法 | 最小生成树 | --- #### **四、技术概念函数** | **英文术语** | **中文翻译** | **说明** | |---------------------------|----------------------|---------------------------------------| | Time Complexity | 时间复杂度 | $O(n), O(n \log n)$ | | Space Complexity | 空间复杂度 | $O(1), O(n)$ | | Recursion | 递归 | 函数调用自身 | | Memoization | 记忆化 | 缓存中间结果(如DP) | | Edge Case | 边界条件 | 输入为0、空、极值等场景 | | In-place Algorithm | 原地算法 | 不占用额外空间(如数组翻转) | --- #### **五、常见操作** | **英文术语** | **中文翻译** | **示例** | |---------------------------|----------------------|---------------------------------------| | Swap | 交换元素 | Swap two nodes in a linked list | | Reverse | 反转 | Reverse a string or linked list | | Merge | 合并 | Merge two sorted arrays | | Rotate | 旋转 | Rotate an array by k steps | | Traversal | 遍历 | In-order traversal of a binary tree | --- #### **六、高频技巧** - **Sentinel Node**(哑节点):用于简化链表操作(如删除头节点)。 - **Fast & Slow Pointers**(快慢指针):检测链表环、找中点。 - **Prefix Sum**(前缀和):快速计算子数组和(如Subarray Sum Equals K)。 - **Bit Manipulation**(位运算):异或、掩码操作(如Single Number)。 --- #### **七、学习建议** 1. **结合题目理解术语**:通过具体题目(如Two Sum)反推算法词汇。 2. **分类记忆**:按数据结构算法类型整理词汇表。 3. **对比相似概念**:如BFS vs DFS,DP vs Greedy。 4. **刷题时标注术语**:在代码注释或笔记中标记对应英文词汇。 如果需要进一步细化某个分类的词汇或示例,可以告诉我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值