力扣热题100

news2024/9/22 17:29:40

排序

快速排序

#include <iostream>
#include <vector>
using namespace std;

// 快速排序函数,传入引用,以便修改原始数组
void quick_sort(vector<int>& q, int l, int r) {
    // 边界条件:如果左边界大于等于右边界,说明已排序完成
    if (l >= r) return;

    // 初始化双指针,i从左向右移动,j从右向左移动
    int i = l - 1, j = r + 1; 
    // 选择中间值作为基准值
    int mid = q[(l + r) >> 1]; // (l + r) >> 1 相当于 (l + r) / 2
    while (i < j) {
        // 从左向右找到第一个大于等于基准值的元素
        do i++; while (q[i] < mid);
        // 从右向左找到第一个小于等于基准值的元素
        do j--; while (q[j] > mid);
        // 如果i小于j,交换它们的位置,确保左边的元素小于等于基准值,右边的元素大于等于基准值
        if (i < j) swap(q[i], q[j]);
    }
    // 递归排序左半部分和右半部分
    quick_sort(q, l, j); // 对左半部分排序
    quick_sort(q, j + 1, r); // 对右半部分排序
}

int main() {
    // 输入
    int n;
    cin >> n;
    vector<int> q(n);
    for (int i = 0; i < n; i++) {
        cin >> q[i];
    }

    // 排序
    quick_sort(q, 0, n - 1); // 调用快速排序函数对整个数组排序

    // 输出
    for (int i = 0; i < n; i++) {
        cout << q[i] << " "; // 打印排序后的数组
    }
    return 0;
}

哈希

1.两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        // 
        unordered_map<int, int> hashtable;
        
        for (int i = 0; i < nums.size(); ++i) {
            // 看能否找到 nums[i],it返回索引
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                // 如果能找到
                return {it->second, i};
            }
            // 记录每个数字的索引
            hashtable[nums[i]] = i;
        }
        return {};
    }
};

2. 49 字母异位词

class Solution:
    def groupAnagrams(self, strs):
        mp = {}
        for str in strs:
            # sorted 后是个列表,需要''.join一下
            key = ''.join(sorted(str))
            if key not in mp:
                # 第一次遍历到,就创建一个[]
                mp[key] = []
            mp[key].append(str)

        ans = []
        for value in mp.values():
            ans.append(value)
        return ans

3. 128 最长连续序列

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        // 不重复的集合
        unordered_set<int> num_set;
        
        for (const int& num : nums) {
            num_set.insert(num);
        }

        int longestStreak = 0;
        for (const int& num : num_set) {
            // 找前一位
            if (!num_set.count(num - 1)) {
                // 设置起始数字
                int currentNum = num;
                // 长度初始化为 1
                int currentStreak = 1;
                // 只要能找到下一个位置的数
                while (num_set.count(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak += 1;
                }
                // 更新最长长度
                longestStreak = max(longestStreak, currentStreak);
            }
        }
        return longestStreak;
    }
};

双指针

283 移动0

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int indexNow = 0;  // 赋值
        int indexNum = 0;
        int m = nums.size();

        // 初始化双指针指向 index 0
        // indexNum 扫描是否为 0
        // 如果不为 0 就交换,并递增 Now(始终指向0)
        // 如果为 0,递增indexNum (始终指向非0,或下一个元素)
        while(indexNum < m) {
            if (nums[indexNum] != 0) {
                nums[indexNow++] = nums[indexNum]; 
            }
            ++indexNum;
        }

        for (int i = indexNow; i < m; i++) {
            nums[i] = 0;
        }
    }
};

11 盛水最多的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0, r = height.size() - 1;
        
        int maxV = 0;
        while (l < r) {
            int len = r - l;
            maxV = max(min(height[l], height[r]) * len, maxV);
            // 收缩小的那一边
            if (height[l] <= height[r]) {
                ++l;
            } else {
                --r;
            }
        }
        return maxV;
    }
};

15 三数之和

class Solution:
    def threeSum(self, nums):
        # 对数组进行排序
        nums.sort()
        n = len(nums)
        res = []

        # 遍历数组,以first作为第一个元素的指针
        for first in range(n):
            # 跳过重复元素,避免重复解
            if first >= 1 and nums[first] == nums[first - 1]:
                continue

            # 初始化第三个元素的指针,从数组末尾开始
            third = n - 1
            # 目标和为当前first元素的相反数
            target = -nums[first]

            # 遍历数组中剩下的元素,以second作为第二个元素的指针
            for second in range(first + 1, n):
                # 跳过重复元素,避免重复解
                if second > first + 1 and nums[second] == nums[second - 1]:
                    continue

                # 调整third指针,使得nums[first] + nums[second] + nums[third]接近于0
                while second < third and nums[second] + nums[third] > target:
                    third -= 1

                # 如果second和third重合,退出循环
                if second == third:
                    break

                # 如果找到满足条件的组合,添加到结果列表中
                if nums[second] + nums[third] == target:
                    res.append([nums[first], nums[second], nums[third]])

        return res

42 接雨水

class Solution {
public:
    int trap(vector<int>& height) {

        // 初始化左右两侧的最大高度
        int leftMax = 0;
        int rightMax = 0;
        int l = 0, r = height.size() - 1;
        int ans = 0;

        while(l < r) {
            // 更新左右两边最大值
            leftMax = max(leftMax, height[l]);
            rightMax = max(rightMax, height[r]);
            // 用高度的较小值更新
            if (height[l] < height[r]) {
                ans += leftMax - height[l];
                l++;
            }else {
                ans += rightMax - height[r];
                r--;
            }
        }
        return ans;

    }
};

滑动窗口

3.无重复字符的最长子串

class Solution:
    def lengthOfLongestSubstring(self, s):
        # 使用一个布尔数组来标记字符是否出现过
        occ = [False] * 200
        n = len(s)
        res = 0

        # 使用滑动窗口的方法,l 和 r 分别表示窗口的左右边界
        l, r = 0, 0
        # 扩展右窗口
        while r < n:
            # 是否循环收缩左窗口?
            # 如果字符 s[r] 在窗口中已存在
            # 则移动左边界 l,直到 s[r] 不在窗口中
            while occ[ord(s[r])] and l < r:
                occ[ord(s[l])] = False
                l += 1
            
            # 标记字符 s[r] 在窗口中出现
            occ[ord(s[r])] = True

            # 更新最大子串长度
            res = max(res, r - l + 1)

            # 移动右边界,扩大窗口
            r += 1

        return res

438 找到字符串中所有字母异位词

class Solution:
    def findAnagrams(self, s, p):
        # 获取字符串 s 和 p 的长度
        m, n = len(s), len(p)
        # 如果 s 比 p 短,返回空列表
        if m < n:
            return []

        # 初始化检查表,记录 p 中每个字符的出现次数
        checkTable = [0] * 26
        for ch in p:
            checkTable[ord(ch) - ord('a')] += 1

        ret = []
        l, r = 0, 0
        while r < m:
            # 移动右指针 r,更新检查表
            checkTable[ord(s[r]) - ord('a')] -= 1

            # 如果某个字符的计数小于0,移动左指针 l,直至计数不小于0
            while checkTable[ord(s[r]) - ord('a')] < 0:
                checkTable[ord(s[l]) - ord('a')] += 1
                l += 1

            # 如果当前窗口大小等于 p 的长度,记录起始位置
            if r - l + 1 == n:
                ret.append(l)

            r += 1

        return ret

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

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

相关文章

全链路追踪关键技术-TraceId、SpanId生成规则

链路追踪的traceid原理梳理 如何追踪微服务调用&#xff1f; ● traceId&#xff0c;用于标识某一次具体的请求ID。当用户的请求进入系统后&#xff0c;会在RPC调用网络的第一层生成一个全局唯一的traceId&#xff0c;并且会随着每一层的RPC调用&#xff0c;不断往后传递&…

【搜索引擎设计:信息搜索怎么避免大海捞针?

在前面我们提到了网页爬虫设计&#xff1a;如何下载千亿级网页&#xff1f;中&#xff0c;我们讨论了大型分布式网络爬虫的架构设计&#xff0c;但是网络爬虫只是从互联网获取信息&#xff0c;海量的互联网信息如何呈现给用户&#xff0c;还需要使用搜索引擎完成。因此&#xf…

AWS EC2的SSM配置(AWS云中的跳板机)

问题 开发人员需要访问AWS云中私有子网的数据库服务等&#xff0c;都需要通过EC2进行SSH隧道代理。这里假设本地已经有一款稳定优秀的SSH客户端工具&#xff0c;并且假设已经会熟练使用SSH的隧道代理。 1.创建EC2 搜索找到EC2服务&#xff0c;如下图&#xff1a; 点击“启动…

ssm基于Java的壁纸网站设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

OpenHarmony源码解析之编译构建

前言 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0c;促进万物互联产业的繁荣发展…

用通俗易懂的方式讲解:Stable Diffusion WebUI 从零基础到入门

本文主要介绍 Stable Diffusion WebUI 的实际操作方法&#xff0c;涵盖prompt推导、lora模型、vae模型和controlNet应用等内容&#xff0c;并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣&#xff0c;但又对Stable Diffusion WebUI使用感到困惑的同学。…

Linux:信号

目录 1.信号 2.信号的过程 a.信号的产生 1:键盘产生, 异常产生 2:系统调用产生信号 3.软件条件产生信号 4.硬件异常产生信号 b.信号的发送 c.信号的处理 d.总结与思考 3.信号保存 1.信号及其它相关常见概念 2.在内核中的表示 3.sigset_t 4. 信号集操作函数 4.信…

C#基于ScottPlot进行可视化

前言 上一篇文章跟大家分享了用NumSharp实现简单的线性回归&#xff0c;但是没有进行可视化&#xff0c;可能对拟合的过程没有直观的感受&#xff0c;因此今天跟大家介绍一下使用C#基于Scottplot进行可视化&#xff0c;当然Python的代码&#xff0c;我也会同步进行可视化。 P…

【SQL注入】SQLMAP v1.7.11.1 汉化版

下载链接 【SQL注入】SQLMAP v1.7.11.1 汉化版 简介 SQLMAP是一款开源的自动化SQL注入工具&#xff0c;用于扫描和利用Web应用程序中的SQL注入漏洞。它在安全测试领域被广泛应用&#xff0c;可用于检测和利用SQL注入漏洞&#xff0c;以验证应用程序的安全性。 SQL注入是一种…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;https://github.com/RazorPad/RazorPad 如果在编译源码时出现&#xff1a;签名时出错: 未能对 bin\Debug\app.publish\RazorPad.exe 签名。SignTool Error: No certifi…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下&#xff1a; select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接&#xff0c;此时就会执行到连接…

Java+Mysql存储过程生成订单序列号

Mysql存储过程生成唯一订单号 直接上代码&#xff01;&#xff01; 1.创建存储过程 CREATE DEFINERrootlocalhost PROCEDURE getOrderSerialNo(# 前缀in orderPrefix varchar(64), # 返回结果out result int) BEGIN# 当前流水号declare curOrderNo int;# 默认值为0declare e…

【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究

目录 主要内容 模型研究 结果一览 下载链接 主要内容 该模型以环境保护成本和运行成本为双目标构建了微电网优化调度模型&#xff0c;模型目标函数和约束条件复现文献《基于改进粒子群算法的微电网多目标优化调度》&#xff0c;程序的特点是采用非支配排序的蜣螂…

学习selenium+python使用 XPath 表达式来实现找到目标元素时智能封装等待,执行测试代码启动Chrome浏览器后,地址栏只显示data;

背景 学习使用 XPath 表达式来实现找到目标元素时智能封装等待执行测试代码启动Chrome浏览器后&#xff0c;地址栏只显示data&#xff1b; 代码如下 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from …

Java SE入门及基础(11)

程序调试 1. 什么是程序调试 当程序出现问题时&#xff0c;我们希望程序能够暂停下来&#xff0c;然后通过我们操作使代码逐行执行&#xff0c;观察整个过程中变量的变化是否按照我们设计程序的思维变化&#xff0c;从而找问题并解决问题&#xff0c;这个过程称之为程序调试…

ftp安装与配置 云服务器 CentOS7

1、FTP的安装 #安装 yum install -y vsftpd#设置开机启动 systemctl enable vsftpd.service#启动 systemctl start vsftpd.service#停止 systemctl stop vsftpd.service#查看状态 systemctl status vsftpd.service 2、配置FTP #修改前先进行备份文件 cp /etc/vsftpd/vsftpd…

LeetCode264. 丑数 II(相关话题:多重指针动态规划)

题目描述 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;12 解释&#xff1a;[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2&am…

物联网协议Coap之Core和NetWork简介

目录 前言 一、Coap的Core包 1、Coap对象 2、Message对象 3、Request对象 4、Response对象 二、Coap的NetWork调试 1、UDP运行模式 2、Network消息接收 3、Sender线程发送数据 三、总结 前言 在之前的博文中&#xff0c;对Californium中Coap的实现进行了简要的介绍&a…

31 树的存储结构二

DIsplay() 递归显示 :图示 求树的高度时&#xff0c;递归的技巧 在递归的过程中&#xff1a;ret单独和任意一个子树的子高度比较&#xff0c;如果ret<max&#xff0c;retmax ------------- 注意&#xff1a;组织链表和子链表的【元素类型】都是TLNode* 链表都要先通过TLNod…

Matlab数学建模算法之模拟退火算法(SA)详解

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…