个人学习编程(3-18) leetcode刷题

news2025/3/19 12:12:49

爬楼梯:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
#include <stdio.h>

int climbStairs(int n) {
    if (n == 1) {
        return 1;
    }
    
    int dp[n + 1];  // 用来存储爬楼梯的方法数
    dp[0] = 1;  // 从地面到第0阶只有一种方式
    dp[1] = 1;  // 到第1阶也只有一种方式

    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];  // 每次可以选择从 i-1 阶或者 i-2 阶到达
    }

    return dp[n];  // 返回爬到第 n 阶的方法数
}

int main() {
    int n;
    printf("请输入楼梯的总阶数 n:");
    scanf("%d", &n);
    int result = climbStairs(n);
    printf("爬到第 %d 阶楼顶的方法数是: %d\n", n, result);
    return 0;
}

 多数元素:

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

双重循环(不能过全部):

arr[nums[i]]来将  数组一的值当做本数组的下标,本数组的值,为上个数组出现的次数,然后只需要遍历值的大小,最后把本数组最大值对应的下标i 返回,即使上个数组最大出现次数的值。

问题:

  1. 负数索引问题:你需要处理负数值的情况。由于数组索引不能是负数,可以通过调整数组索引的方法来处理负数。

    • 你可以将每个元素值 nums[i] 加上一个常量值,使得所有索引变为正数。比如,arr[nums[i] + 500000] 可以把负数映射到正数索引。
    • 这样,nums[i] 的值范围 [-1000000, 1000000] 会映射到 arr 数组的索引范围 [0, 1000000]。
  2. 代码逻辑改进:在循环中,你只需要更新每个元素的出现次数,而不是每次都重置 count,并且你应该避免重复存储。

#include <stdio.h>

int majorityElement(int* nums, int numsSize) {
    int count;
    int times = numsSize / 2;
    int arr[1000001] = {0}; // 调整数组大小
    int index = 0;
    int max = 0;

    for (int i = 0; i < numsSize; i++) {
        // 处理负数索引问题:将nums[i]映射到正数索引
        int idx = nums[i] + 500000; // 偏移值,使索引始终为正

        arr[idx]++; // 直接增加出现次数

        // 记录最大出现次数
        if (arr[idx] > max) {
            max = arr[idx];
            index = nums[i];
        }
    }

    return index;
}

int main() {
    int nums[] = {-1, 1, 1, 1, 2, 1};
    int numsSize = 6;
    printf("Majority Element: %d\n", majorityElement(nums, numsSize));
    return 0;
}

摩尔投票法:

#include <stdio.h>

int majorityElement(int* nums, int numsSize) {
    int count = 0;
    int candidate = 0;

    // 摩尔投票法
    for (int i = 0; i < numsSize; i++) {
        if (count == 0) {
            candidate = nums[i]; // 找到新的候选元素
        }
        count += (nums[i] == candidate) ? 1 : -1; // 如果是候选元素,计数加 1,否则减 1
    }

    return candidate; // 最终候选元素即为多数元素
}

int main() {
    int nums[] = {3, 2, 3};
    int numsSize = 3;
    printf("Majority Element: %d\n", majorityElement(nums, numsSize));

    int nums2[] = {2, 2, 1, 1, 1, 2, 2};
    int numsSize2 = 7;
    printf("Majority Element: %d\n", majorityElement(nums2, numsSize2));

    return 0;
}

买卖股票的最佳时机:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
#include <stdio.h>
#include <bits/stdc++.h>

int maxProfit(int* prices, int pricesSize) {
    int i;
    int min = prices[0];  // 初始化最小买入价格为第一个价格
    int max_profit = 0;    // 初始化最大利润为0

    for (i = 1; i < pricesSize; i++) {  // 从第二天开始
        if (prices[i] < min) {
            min = prices[i];  // 如果当前价格低于最小价格,更新最小价格
        } else {
            // 计算当前价格和最小价格的利润,并更新最大利润
            int profit = prices[i] - min;
            if (profit > max_profit) {
                max_profit = profit;
            }
        }
    }

    return max_profit;  // 返回最大利润
}

int main() {
    int nums[6] = {7, 1, 5, 3, 6, 4};
    int m = maxProfit(nums, 6);
    printf("%d\n", m);  // 输出最大利润

    return 0;
}

SingleNumber:

找到数组当中的单一的数字

双重循环: 

#include <stdio.h>
#include <bits/stdc++.h>

int singleNumber(int *nums,int numsSize){
    int i,j;
    for (int i = 0; i < numsSize; i++)
    {
        //printf("%d\n",nums[i]);
        int count = 0;
        for (j = 0; j < numsSize; j++){
            if (nums[j] == nums[i]){
                count++;
            }
        }
        if (count == 1){
            return nums[i];
        }
    }
    return -1;
}
int main() {
    int arr[]={2,2,3,3,5};
    int singleNumber(int *nums,int numsSize);
    int a = singleNumber(arr,5);
    printf("%d\n",a);
}

 亦或:

#include <stdio.h>
#include <bits/stdc++.h>

int singleNumber(int *nums,int numsSize){
    int n = nums[0];
    int i;
    for(i = 1;i < numsSize;i++){
        n ^= nums[i];
    }
    return n;
    //因为亦或,相同的元素亦或就是0,0亦或任何数还是任何数
}
int main() {
    int arr[]={2,2,3,3,5};
    int singleNumber(int *nums,int numsSize);
    int a = singleNumber(arr,5);
    printf("%d\n",a);
}

找一个数列的子序列的最大值

双重循环:

#include <stdio.h>
#include <bits/stdc++.h>

int maxSubArray(int* nums,int numsSize){
    int max = nums[0];
    printf("i j : sum\n ---------");
    int i,j,k;
    for (i = 0;i < numsSize; i++){
        for ( j = 0; j < numsSize; j++)
        {
            int sum = 0;
            for (int k = i; k < j; k++)
            {
                sum += nums[k];
            }
        
        if (sum > max)
        {
            max = sum;
        }
        printf("%d %d : %2d (%d)\n",i,j,sum,max);
        }
    }
    return max;
}

int main() {
    int maxSubArray(int* num,int numsSize);
    int arr[] = {-2,1,-3,4,-1,2,1,-5,4};
    int max = arr[0];
    max = maxSubArray(arr,9);
    printf("%d",max);
}

记录最大值:

for (int i = 0; i < numsSize; i++){        

        for (int j = i; j < numsSize; j++){
                    sum += nums[j];
                if (sum > max){
                    max = sum;
                }
           }

}

这段代码会记录从 i=0到numsSize-1的位置,再到 i=1到numsSize-1位置,慢慢记录他们的和赋值给max。

#include <stdio.h>
#include <bits/stdc++.h>

int maxSubArray(int* nums,int numsSize){
    int max = nums[0];
    for (int i = 0; i < numsSize; i++){
        int sum = 0;
        
        for (int j = i; j < numsSize; j++){
            sum += nums[j];
        if (sum > max){
            max = sum;
        }
        }
    }
    return max;
}


int main() {
    int maxSubArray(int* num,int numsSize);
    int arr[] = {-2,1,-3,8,-1,2,1,-5,4};
    int max = arr[0];
    max = maxSubArray(arr,9);
    printf("%d",max);
}

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

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

相关文章

【css酷炫效果】纯CSS实现立体旋转立方体

【css酷炫效果】纯CSS实现立体旋转立方体 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492014 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&am…

LLM中lora的梯度更新策略公式解析

LLM中lora的梯度更新策略公式解析 目录 LLM中lora的梯度更新策略公式解析区别如何使用LoRA代码中的参数更新方式二阶导数(如右侧公式关联的Fisher信息)的作用区别 定义与理论来源: 左公式 F ( w i ) = 1 n

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略&#xff1a;开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备&#xff08;一&#xff09;系统要求&#xff08;二&#xff09;硬件要求 三、下载安装包&#xff08;一&#xff09;官网下载&#xff08;二&#xff09;其…

线程大乱斗:从入门到精通,解锁Java并发编程的终极秘籍

目录 什么是线程&#xff1f; jave创建线程方式有几种&#xff1f; 线程中常用的方法 线程状态 多线程 解决线程安全问题 线程通信 何为并发编程&#xff1f; 并发执行和并行执行 线程的三个主要问题&#xff1a; 1、不可见性&#xff1a; 2、乱序性&#xff1a; …

Web3游戏行业报告

一&#xff0c;gamefi经济 什么是gamefi GameFi是一个缩写&#xff0c;它结合了游戏和去中心化金融(“DeFi”)这两个术语&#xff0c;关注的是游戏玩法如何在去中心化系统中实现货币化。对于游戏而言&#xff0c;只要开放了交易市场&#xff0c;允许玩家自由买卖&#xff0c;…

hibernate 自动生成数据库表和java类 字段顺序不一致 这导致添加数据库数据时 异常

hibernate 自动生成的数据库表和java类 字段顺序不一致 这导致该书写方式添加数据库数据时 异常 User user new User( null, username, email, phone, passwordEncoder.encode(password) ); return userRepository.save(user);Hibernate 默认不会保证数据库表字段的顺序与 Ja…

Cursor在内网环境配置自定义DeepSeek API

关键字 Cursor、DeepSeek、API配置、内网代理、HTTP/2 背景环境 使用Cursor集成环境开发程序。但是我使用公司的内网并不能使用cursor自带的模型&#xff0c;于是我就想使用DeepSeek官方的API服务。 环境&#xff1a;Windows 11系统 解决过程 网络检测 首先进行环境检测&am…

【初学者】解释器和脚本各是什么?有什么区别与联系?

李升伟 整理 解释器和脚本的定义 1. 解释器&#xff08;Interpreter&#xff09; 定义&#xff1a;解释器是一个程序&#xff0c;负责逐行读取并执行代码。它将源代码翻译成机器能理解的指令&#xff0c;并立即执行。特点&#xff1a; 逐行执行代码。适合交互式编程&#xf…

Kafka跨集群数据备份与同步:MirrorMaker运用

#作者&#xff1a;张桐瑞 文章目录 前言MirrorMaker是什么运行MirrorMaker各个参数的含义 前言 在大多数情况下&#xff0c;我们会部署一套Kafka集群来支撑业务需求。但在某些特定场景下&#xff0c;可能需要同时运行多个Kafka集群。比如&#xff0c;为了实现灾难恢复&#x…

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…

观察者模式详解:用 Qt 信号与槽机制深入理解

引言 你是否曾遇到这样的需求&#xff1a;一个对象的状态发生变化后&#xff0c;希望通知其他对象进行相应的更新&#xff1f;比如&#xff1a; 新闻订阅系统&#xff1a;当新闻发布后&#xff0c;所有订阅者都会收到通知。股票行情推送&#xff1a;股价变化时&#xff0c;所…

OSWorld:开启多模态智能体的真实计算机环境革命

OSWorld:开启多模态智能体的真实计算机环境革命 在人工智能技术突飞猛进的今天,多模态智能体正逐步突破实验室的限制,试图融入人类的日常工作场景。然而,如何评估这些智能体在真实计算机环境中处理开放式任务的能力,成为学术界和产业界共同关注的难题。2024年,由xlang-ai…

LabVIEW烟气速度场实时监测

本项目针对燃煤电站烟气流速实时监测需求&#xff0c;探讨了静电传感器结构与速度场超分辨率重建方法&#xff0c;结合LabVIEW多板卡同步采集与实时处理技术&#xff0c;开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行&#xff0c;提供高…

强化学习基础篇二:马尔可夫决策过程

写在前面 本文是对李沐等“动手学强化学习”教程的个人阅读总结&#xff0c;原文链接&#xff1a;动手学强化学习。 第3章 马尔可夫决策过程 3.1 重要性 马尔可夫决策过程是强化学习中的基础概念&#xff0c;强化学习中的环境就是一个马尔可夫决策过程&#xff0c;与多臂老虎…

EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级

客户的汽车零部件制造商需要升级其变速箱齿轮加工生产线&#xff0c;面临的关键挑战是整合新引进的欧洲齿轮精密检测设备&#xff08;基于EtherCAT协议&#xff09;与现有使用profinet协议自动化系统通信。 企业核心控制平台基于西门子PLC&#xff0c;而现场各工位采用分布式I/…

tongweb7控制台无法访问

tongweb7控制台无法访问 排查 1.首先确认版本&#xff0c;如果版本是轻量级版本&#xff0c;轻量版不支持会话(session)的备份和复制、管理控制台、APM 运维工具等企业级增量功能。 2.查看端口 命令&#xff1a;ss -tnlp 或者netstat -tnlp 确认控制台端口是否开启 3.在conf…

【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中&#xff0c;下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构&#xff1a;STD_STM…

搞定python之九----常用内置模块

本文是《搞定python》系列文章的第九篇&#xff0c;介绍常用的内置模块的使用。到此为止python的基础用法就彻底说完了&#xff0c;大家可以在此基础上学习爬虫、web处理等框架了。 本文的代码相对比较多&#xff0c;大家注意看代码即可。python的文档我贴出来&#xff0c;毕竟…

判断是不是完全二叉树(C++)

目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 定义队列&#xff0c;初始化根节点 4.2 层序遍历&#xff0c;处理每个节点 4.3 处理空节点 4.4 处理非空节点 5 总结 1 问题描述 给定一个二叉树&#xff0c;确定他是否是一…

神经外科手术规划的实现方案及未来发展方向

Summary: 手术规划软件 效果图&#xff0c;样例&#xff1a; 神经外科手术规划样例&#xff1a; 神经外科手术规划&#xff0c;三维重建&#xff0c;三维建模&#xff0c;三维可视化 Part1: 手术规划的定义与作用 一、手术规划的定义 手术规划是指在手术前&#xff0c;通过详…