从零开始刷LeetCode-0

从leetcode中简单的题开始,上车吧

给定数组vector<vector>& dominoes;
若其中元素为二维数组,若元素i=元素j
或元素i=元素j[::-1]则称其可等价;
求在i<j的前提下,给定dominoes一共有多少个等价的pair?
?:
输入:dominoes =[[1,2],[2,1],[3,4],[5,6]]
输出:1 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs

解题思路1:

使用两个循环嵌套伪代码如下:

for i in range (len_d):
    for j in range (i+1,len_d,1):
          balabala....

这样的思路是简单明了,但是缺点就是复杂度太高,运行慢,能不用嵌套循环就不用

解题思路2:

先使用一次循环,统计每个vector元素出现的个数n;

然后某个vector元素可以组成的pair数量就是n*(n-1)/2;

累加即可;

代码:

class Solution {
public:
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
int len_dominoes=dominoes.size();
int num_e=0;
map<pair<int,int>, int> pair_map;
for (auto &vec_i: dominoes){
    if (vec_i[0]>vec_i[1]){
        swap(vec_i[0],vec_i[1]);
            }
            pair_map[make_pair(vec_i[0],vec_i[1])]++;  
        }
for (auto &pv:pair_map){
    if (pv.second>1){
        num_e+=pv.second*(pv.second-1)/2;
            }
        }
return num_e;
    }
};

c++ 知识点:

swap: 此处swap 交换vector 两个元素的地址;

map 程序中初始值默认为0;

map.second :使用迭代器访问,iter->first指向元素的键,iter->second指向键对应的值。 另外,使用下标访问map容器与使用下标访问vector的不同之处:用下标访问map中不存在的元素将导致在map容器中添加一个新的元素;

### 如何使用 C++ 从零开始高效 LeetCode 题目 #### 初步准备 为了能够顺利地利用 C++ 进行 LeetCode 的练习,首先需要完成注册与登录操作[^1]。这一步骤是进入平台并解锁其功能的基础。 #### 学习基础语法 熟悉 C++ 基础语法对于解决算法问题是至关重要的。可以通过编写简单的程序来掌握基本的数据结构和控制流语句。例如,在处理优先队列时可以参考如下代码片段: ```cpp #include <iostream> #include <queue> int main() { std::priority_queue<int, std::vector<int>, std::greater<>> q; // 小顶堆定义 q.push(9); q.push(-1); q.push(8); while (!q.empty()) { std::cout << q.top() << " "; q.pop(); } } ``` 上述代码展示了如何通过 `std::greater` 和 `std::less` 来分别创建小顶堆和大顶堆[^2]。 #### 掌握核心数据结构与算法 LeetCode 上的许多题目都涉及常见的数据结构和算法设计模式。比如动态规划是一种非常有效的解决问题的方法之一。在某些情况下,可能需要用动态规划的思想求解最优子结构性质的问题。例如,“买卖股票的最佳时机”问题可以用以下方式实现[^3]: ```cpp class Solution { public: int maxProfit(vector<int>& prices) { if (prices.size() == 0) return 0; int minPrice = INT_MAX; int maxProfit = 0; for(auto price : prices){ if(price < minPrice) minPrice = price; else if((price - minPrice) > maxProfit) maxProfit = price - minPrice; } return maxProfit; } }; ``` #### 动态规划的应用实例 当遇到更复杂的优化类问题时,如硬币找零问题,则需深入理解动态规划的核心概念及其应用方法。具体来说,这类问题通常涉及到状态转移方程的设计以及边界条件的设定。以下是基于完全背包模型的一个解决方案示例[^4]: ```cpp const static int INF = 0x3f3f3f3f; class Solution { public: int coinChange(vector<int> &coins, int amount) { vector<int> dp(amount + 1, INF); dp[0] = 0; for(int i=0;i<coins.size();i++) { for(int j=coins[i];j<=amount;j++) { if(dp[j-coins[i]] != INF){ dp[j] = min(dp[j], dp[j-coins[i]]+1); } } } return dp[amount]==INF ? -1 : dp[amount]; } }; ``` #### 记录与总结 持续记录个人的学习过程非常重要。即使不详尽解释每道题目的解答逻辑,也应保存已完成的任务列表以便后续复习巩固所学知识[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值