首页 > 编程语言 >力扣算法

力扣算法

时间:2025-01-04 23:46:12浏览次数:1  
标签:return nums int fast 力扣 括号 算法 public

1.[两数之和]
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
暴力法
public int[] TwoSum(int[] nums, int target)
{
    // 第一层循环:遍历数组中的每个数
    for (int i = 0; i < nums.Length; i++)
    {
        // 第二层循环:从i的下一个位置开始遍历
        for (int j = i + 1; j < nums.Length; j++)
        {
            // 判断当前两个数的和是否等于目标值
            if (nums[i] + nums[j] == target)
            {
                return new int[] { i, j };  // 找到答案就立即返回这两个数的索引
            }
        }
    }
    return new int[] { 0, 0 };  // 如果没找到,返回默认值
}
哈希法
public int[] TwoSum(int[] nums, int target)
{
    // 创建字典,用于存储数字和它的索引
    Dictionary<int, int> map = new Dictionary<int, int>();
    
    // 只需要一次遍历
    for (int i = 0; i < nums.Length; i++)
    {
        // 计算需要配对的数字
        int complement = target - nums[i];
        // 检查字典中是否已经存在配对的数字
        if (map.ContainsKey(complement))
        {
            // 如果存在,返回配对数字的索引和当前数字的索引
            return new int[] { map[complement], i };
        }
        // 如果当前数字不在字典中,将其加入字典
        if (!map.ContainsKey(nums[i]))
        {
            map.Add(nums[i], i);
        }
    }
    
    return new int[] { 0, 0 };
}

2.[移动零]
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
双指针
public class Solution {
    public void MoveZeroes(int[] nums) 
    {
        // 慢指针指向要填入非零数的位置
        int slow = 0;
        
        // 快指针遍历数组寻找非零数
        for (int fast = 0; fast < nums.Length; fast++)
        {
            // 当找到非零数时
            if (nums[fast] != 0)
            {
                // 如果两个指针不同,进行交换
                if (slow != fast)
                {
                    nums[slow] = nums[fast];
                    nums[fast] = 0;
                }
                // 移动慢指针
                slow++;
            }
        }
    }
}

3.[有效的括号]
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。

输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
public class Solution {
    public bool IsValid(string s) 
    {
        // 创建一个栈来存储左括号
        Stack<char> stack = new Stack<char>();
        // 遍历字符串中的每个字符
        foreach(char c in s)
        {
            // 如果是左括号,入栈
            if(c == '(' || c == '[' || c == '{')
            {
                stack.Push(c);
            }
            // 如果是右括号
            else
            {
                // 如果栈为空,说明没有匹配的左括号
                if(stack.Count == 0) return false;
                // 获取栈顶的左括号
                char top = stack.Pop();
                // 检查是否匹配
                if(c == ')' && top != '(') return false;
                if(c == ']' && top != '[') return false;
                if(c == '}' && top != '{') return false;
            }
        }
        // 最后检查栈是否为空
        return stack.Count == 0;
    }
}

4.[爬楼梯]
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
动态规划
public class Solution {
    public int ClimbStairs(int n) {
        // 处理基础情况:如果台阶数小于等于2,直接返回n
        if(n <= 2) return n;
        
        // 创建动态规划数组,dp[i]表示爬到第i阶的方法数
        int[] dp = new int[n + 1];
        dp[1] = 1;  // 爬到第1阶只有1种方法
        dp[2] = 2;  // 爬到第2阶有2种方法
        
        // 从第3阶开始,每一阶的方法数是前两阶方法数的和
        for(int i = 3; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        
        // 返回爬到第n阶的方法数
        return dp[n];
    }
}
递归
public class Solution {
    public int ClimbStairs(int n) {
        // 处理基础情况
        if(n <= 2) return n;
        
        // 只用两个变量记录前两阶的方法数
        int prev = 1;  // 记录i-2阶的方法数
        int curr = 2;  // 记录i-1阶的方法数
        
        // 计算每一阶的方法数
        for(int i = 3; i <= n; i++) {
            int temp = curr;     // 暂存当前值
            curr = prev + curr;  // 新的方法数
            prev = temp;         // 更新前一阶的方法数
        }
        
        return curr;
    }
}

5.[杨辉三角]

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

标签:return,nums,int,fast,力扣,括号,算法,public
From: https://www.cnblogs.com/dou66/p/18652775

相关文章

  • java简单算法题001(保姆级教学)
    问题描述在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。要求:设计一个算法,使其时间复杂度为O(n),其中n是班级的人数。尽量减少额......
  • 【哈希算法】实战应用
    一、使用哈希进行函数调用使用哈希隐藏API调用代码#include<windows.h>#include<stdio.h>intmain(){MessageBoxA(NULL,"Meow-meow!","=^..^=",MB_OK);return0;}编译i686-w64-mingw32-g++meow.c-omeow.exe-mconsole-I/usr/share/mingw-w64......
  • 恶意软件常用加密算法
    前面主要是加密字符串信息,加密算法还可以加密shellcode、通信数据包、配置信息等一、常用加密算法概述加密配置信息、加密通信信道、加密窃取数据、混淆代码放置静态分析总体来说就是加密shellcode、代码模块、配置信息、通信等二、加密配置信息设置一个场景,恶意dll文件,放在h......
  • Python机器学习算法KNN、MLP、NB、LR助力油气钻井大数据提速参数优选及模型构建研究
    全文链接:https://tecdat.cn/?p=38601原文出处:拓端数据部落公众号分析师:HuayanMu随着机器学习和大数据分析技术的发展,帮助客户进行油气行业数字化转型势在必行,钻井提速参数优选呈现由经验驱动、逻辑驱动向数据驱动转变的趋势。机械钻速最大化、机械比能最小化是钻井过程中常考......
  • 跳跃游戏II(贪心算法)
    给定一个长度为 n 的 0索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i+j] 处:0<=j<=nums[i] i+j<n返回到达 nums[n-1] 的最小跳跃次数。生......
  • 算法提高 校门外的树
    时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++512MB,其他语言1024MB难度:困难分数:100 OI排行榜得分:14(0.1*分数+2*难度)描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位......
  • 【无人机协同】遗传算法GA同构异构无人机UAV协同搜索【含Matlab源码 10916期】
    ......
  • java基于Spark的温布尔登特色赛赛事数据分析预测及算法实现
    目录系统实现截图开发核心技术介绍技术栈核心代码部分展示操作手册视频演示/源码获取系统实现截图开发核心技术介绍springboot+Element-UI+vue本系统采用MVVM模式,开发框架使用SpringBoot框架,开发工具使用IDEA,VisualStudioCode,Web服务器使用Tomcat,数据库服......
  • 机器学习算法的分类
    一、按学习方式分类1.监督学习(SupervisedLearning)(1)定义:使用已标记的数据进行训练,每个输入数据都有对应的输出标签。模型学习输入与输出之间的映射关系。按以上可以分为以下两种:分类任务:将输入分配到预定义的类别(如0-9数字识别)。回归任务:预测连续数值(如房价预测)。(2)常......
  • 跳跃游戏(贪心算法)
    给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1:输入:nums=[2,3,1,1,4]输出:true解释:可以先跳1步,从下标0到达下标......