枚举算法-day1

1.两数之和

题目

解析

  • 枚举右指针 j,同时记录进哈希表,对于遍历的 nums[j],寻找哈希表中是否有 target - nums[j];
  • 与双指针算法的不同点在于,本题需要记录下标,而双指针算法需要有序;
  • 时间复杂度:O(n);空间复杂度:O(n);空间换时间

代码

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(n)

        unordered_map<int,int> idx;

        for(int j = 0; ;j ++){
            auto it = idx.find(target - nums[j]);
            if(it != idx.end()) { // 找到了
                return {it -> second,j};
            }

            idx[nums[j]] = j;// 保存 nums[j] 和 j
        }
    }
};

2.好数对的数目

题目

解析

  • 同理可得

代码

cpp 复制代码
class Solution {
public:
    int numIdenticalPairs(vector<int>& nums) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(n)

        int res = 0;
        unordered_map<int,int> cnt;

        for(int j = 0;j < nums.size();j ++){
            if(cnt[nums[j]]) res += cnt[nums[j]];
            cnt[nums[j]] ++;
        }

        return res;
    }
};

3.可互换矩形的组数

题目

解析

  • 同理可得,注意计算要 * 1.0;

代码

cpp 复制代码
class Solution {
public:
    long long interchangeableRectangles(vector<vector<int>>& rectangles) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(n)

        long long ans = 0;
        unordered_map<double,int> cnt;

        for(int j = 0;j < rectangles.size();j ++){
            double x = rectangles[j][1] * 1.0 / rectangles[j][0];

            if(cnt[x]) ans += cnt[x];
            cnt[x] ++;
        }

        return ans;
    }
};
相关推荐
长安——归故李6 分钟前
【modbus学习】
java·c语言·c++·学习·算法·c#
Boop_wu20 分钟前
[数据结构] LinkedList
数据结构
兴科Sinco32 分钟前
[leetcode 1]给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数[力扣]
python·算法·leetcode
沐怡旸33 分钟前
【算法--链表】138.随机链表的复制--通俗讲解
算法·面试
anlogic39 分钟前
Java基础 9.10
java·开发语言·算法
薛定谔的算法41 分钟前
JavaScript单链表实现详解:从基础到实践
数据结构·算法·leetcode
CoovallyAIHub1 小时前
CostFilter-AD:用“匹配代价过滤”刷新工业质检异常检测新高度! (附论文和源码)
深度学习·算法·计算机视觉
幻奏岚音1 小时前
《数据库系统概论》第一章 初识数据库
数据库·算法·oracle
你好,我叫C小白1 小时前
贪心算法(最优装载问题)
算法·贪心算法·最优装载问题
CoovallyAIHub1 小时前
CVPR 2025 | 频率动态卷积(FDConv):以固定参数预算实现频率域自适应,显著提升视觉任务性能
深度学习·算法·计算机视觉