LEETCODE3

news2024/11/26 10:42:15

法一:记忆化递归

int climbStairsRecursive(int n, int* memo) {
    if (n <= 2) {
        return n;
    }
    if (memo[n] > 0) {
        return memo[n];
    }
    memo[n] = climbStairsRecursive(n - 1, memo) + climbStairsRecursive(n - 2, memo);
    return memo[n];
}

int climbStairs(int n) {
    int* memo = (int*)malloc((n + 1) * sizeof(int));
    if (memo == NULL) {
        return -1; // 内存分配失败
    }
    memset(memo, 0, (n + 1) * sizeof(int));
    int result = climbStairsRecursive(n, memo);
    free(memo);
    return result;
}

法二:动态规划

int climbStairs(int n) {
    int p = 0, q = 0, r = 1;
    for (int i = 1; i <= n; ++i) {
        p = q;
        q = r;
        r = p + q;
    }
    return r;
}

尽管代码中没有明确地使用一个数组来存储状态,但是动态规划的核心思想仍然被运用了:将问题分解成子问题,利用已经求解过的子问题的解来求解当前问题。

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int hash[1000] = {0}; // 将 hash 数组初始化为 0
    int* res = (int*)malloc(sizeof(int) * nums1Size); // 根据 nums1 的大小来动态分配内存
    *returnSize = 0; // 初始化返回数组的大小为 0

    // 遍历 nums1,将 nums1 中的元素作为 hash 数组的下标,标记出现过的数字
    for(int i = 0; i < nums1Size; i++) {
        hash[nums1[i]] = 1;
    }

    // 遍历 nums2,如果 nums2 中的元素在 hash 中出现过,则将其添加到返回数组中
    for(int j = 0; j < nums2Size; j++) {
        if(hash[nums2[j]] == 1) {
            res[(*returnSize)++] = nums2[j];
            hash[nums2[j]] = 0; // 避免重复添加相同的数字,这里很巧妙,添加了一次将hash对应改为0
                                  //下一次就算是相同的数字也匹配不了了
        }
    }

    return res;
}

struct hashTable{
   int key;
   int val;
   UT_hash_handle hh;
};

int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size){
    struct hashTable*hashtable=NULL;
    for(int i=0;i<nums1Size;i++)
    {
        for(int j=0;j<nums2Size;j++)
        {
            int ikey=nums1[i]+nums2[j];
            struct hashTable*tmp;
            HASH_FIND_INT(hashtable,&ikey,tmp);
            if(!tmp)
            {
                struct hashTable*tmp=malloc(sizeof(struct hashTable));
                tmp->key=ikey;
                tmp->val=1;
                HASH_ADD_INT(hashtable,key,tmp);
            }
            else
            {
                tmp->val++;
            }

        }
    }
    int ans=0;
    for(int i=0;i<nums3Size;i++)
    {
        for(int j=0;j<nums4Size;j++)
        {
           int ikey=-(nums3[i]+nums4[j]);
           struct hashTable*tmp;
           HASH_FIND_INT(hashtable,&ikey,tmp);
           if(tmp)
           {
            ans+=tmp->val;
           }
        }
    }
    return ans;
}

先遍历A,B再遍历C,D算法时间复杂度为n的平方,先遍历A,再遍历B,C,D算法时间复杂度是n的三次方,所以我们采用两个for循环比较好

key表示节点的值,val表示这个值在两个数组A,B组合出现过几次

第一个两重for循环先遍历所有A,B数组的所有值,然后记录次数

第二个两重for循环也同样遍历所有C,D所能构成的值,如果其相反数在哈希表中可以找的到的话,就ans加上第一个双层for记录的出现的次数

参考:【学透哈希表,map使用有技巧!LeetCode:454.四数相加II-哔哩哔哩】 https://b23.tv/diFkLwW

 

void HASH_ADD_INT(hh, head, add);

其中:

  • hh 是哈希表中用于链接的哈希结构体的字段名。
  • head 是指向哈希表的指针的名称。
  • add 是要添加到哈希表中的结构体节点的指针。

在您的代码中,HASH_ADD_INT(hashtable, key, tmp); 的作用是将指向结构体节点 tmp 的指针添加到名为 hashtable 的哈希表中。key 是结构体中用于作为键值的整数字段的名称。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1511715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML 控件添加键盘事件

在QML中&#xff0c;可以使用Keys类型来处理键盘事件。以下是一个简单的示例&#xff0c;演示如何在QML控件中添加键盘事件&#xff1a; import QtQuick 2.12 import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Recta…

Linux的MySQL安装与卸载

安装与卸载 卸载安装配置yum源安装MySQL 声明一下本人用的Linux版本是CentOs7.9版本的。 卸载 如果我们用的云服务器&#xff0c;云服务器可能会自带MySQL或者mariadb&#xff08;其实就是MySQL的一个开源分支&#xff09;&#xff0c;如果我们不想用自带的&#xff0c;需要先…

理论学习 BatchNorm2d

import torch import torch.nn as nn# With Learnable Parameters m nn.BatchNorm2d(100) # Without Learnable Parameters m nn.BatchNorm2d(100, affineFalse) input torch.randn(20, 100, 35, 45) output m(input)print(output) print(output.shape)这段代码展示了如何使…

mybatis-plus-generator 使用 velocity 生成前后台代码

操作步骤 1&#xff09;准备mybatis-plus 生成代码的 vm文件 2&#xff09;添加依赖 mybatis-plus-generator 代码生成器的依赖 3&#xff09;执行工具方法生成代码 1、准备 mybatis-plus 生成代码的 vm文件 1&#xff09;找vm模板 去工程的 external Libraries 找到 mybati…

ES6基础6

Promise对象 Promise的含义 所谓Promise&#xff0c;简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件&#xff08;通常是一个异步操作&#xff09;的结果。从语法上说&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息。Promise提供统一的…

深度学习笔记_8隐马尔可夫模型(HMM)

隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型&#xff0c;在语音识别、行为识别、NLP、故障诊断等领域具有高效的性能。 HMM是关于时序的概率模型&#xff0c;描述一个含有未知参数的马尔可夫链所生成的不可观测的状态随机序列&#xff0c;再由各个状态生成观测随…

设计模式 -- 1:简单工厂模式

目录 代码记录代码部分 代码记录 设计模式的代码注意要运用到面向对象的思想 考虑到紧耦合和松耦合 把具体的操作类分开 不让其互相影响&#xff08;注意这点&#xff09; 下面是UML类图 代码部分 #include <iostream> #include <memory> // 引入智能指针的头文…

linux 模拟shell

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/G90eI⏪   &#x1f69a;代码仓库:Linux: Linux日常代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d;&#x1f5…

[linux] socket 非阻塞模式使用注意事项

在使用 socket 的一些 api 的时候&#xff0c;默认情况下都是阻塞模式。比如使用 tcp socket 时&#xff0c;客户端调用 connect() 创建连接&#xff0c;connect() 返回的时候要么是创建连接成功了&#xff0c;要么是出现了错误&#xff0c;反正 connect() 返回的时候结果是确定…

Unsupervised RL:METRA: Scalable Unsupervised RL with Metric-Aware Abstraction

ICLR 2024 Oral paper Intro 无监督RL旨在发现潜在的行为帮助提高下游任务效率以往方法集中于探索以及基于互信息的技能发现(skill)。然而去前者在高危复杂空间实现困难&#xff0c;后者也容易因为缺乏激励导致探索能力不足。本文提出METRA核心观点认为与其在复杂状态空间处理…

OGNL表达式

文章目录 一、简介二、快速入门三、详细使用3.1 基本数据类型3.2 对象类型3.3 List集合3.4 Set集合3.5 Map集合3.6 数组3.7 静态调用3.8 算术运算3.9 逻辑运算3.10 同时执行多个表达式3.11 位运算 Ognl使用总结 - 源链接在此 >> 一、简介 OGNL&#xff08;Object-Graph…

小兔鲜鲜项目(前端vue3)

成果图 大家喜欢给一个赞被&#xff0c; 项目地址&#xff1a;gitee 注意&#xff1a;项目克隆下去之后先运行 npm i之后安装项目插件包之后在npm run dev 运行就可以了

“成像光谱遥感技术中的AI革命:ChatGPT应用指

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

python读取execl里的图片

正常的读取图片 from openpyxl import load_workbook from PIL import Imagefrom openpyxl import load_workbook wb load_workbook(rC:\Users\Administrator\Downloads\output1111.xlsx) ws wb[wb.sheetnames[0]] for image in ws._images:data image.anchor._fromif image…

深入学习默认成员函数——c++指南

前言&#xff1a;类和对象是面向对象语言的重要概念。 c身为一门既面向过程&#xff0c;又面向对象的语言。 想要学习c&#xff0c; 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

家长应如何培养孩子对人工智能(AI)的兴趣?无际Ai分享

随着科技的飞速发展&#xff0c;人工智能已经成为了当今社会的重要组成部分。然而&#xff0c;在中小学阶段&#xff0c;很少有学校系统地对学生进行人工智能方面的教育。作为普通家庭的家长&#xff0c;我们可以通过一些方法来激发孩子对人工智能的兴趣&#xff0c;让他们在这…

网络工程师——2024自学

一、怎样从零开始学习网络工程师 当今社会&#xff0c;人人离不开网络。整个IT互联网行业&#xff0c;最好入门的&#xff0c;网络工程师算是一个了。 什么是网络工程师呢&#xff0c;简单来说&#xff0c;就是互联网从设计、建设到运行和维护&#xff0c;都需要网络工程师来…

第7讲:数组和函数实践:扫雷游戏

第7讲&#xff1a;数组和函数实践&#xff1a;扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析1.2.2 文件结构设计 2. 扫雷游戏的代码实现3. 扫雷游戏的扩展 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 • 使用控制台实现…

Edu 12 --- Simple Subset -- 题解 (一个比较巧妙的思维算法题)

Simple Subset&#xff1a; 题解&#xff1a; 思路解析&#xff1a; 题目要求任意两个数的和为质数&#xff0c;那我们最坏情况就是任意选择一个数&#xff0c;此时子集为最大。 如果子集中有两个奇数或者偶数&#xff0c;他们两个之和一定会被2整除&#xff0c;那么我们只能…

keilC51明明已经定义的变量却报错未定义与期待asm

文章目录 keil_C51采用的是C89标准&#xff1a;C89变量定义标准&#xff1a;程序块&#xff1a; expected __asm&#xff1a;已经定义某个变量却报错未定义该变量&#xff1a;从汇编语言中看&#xff1a; keil_C51采用的是C89标准&#xff1a; C89变量定义标准&#xff1a; 1…