力扣热题100

排序

快速排序

#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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

胶囊-药品广告数据库-解锁药品营销市场

随着医药技术的不断进步&#xff0c;药品市场的竞争也日益激烈&#xff0c;而「广告营销」一直以来都是医药企业发展过程中的重要环节&#xff0c;越来越多的药企意识到药品广告在品牌传播和营销方面的巨大潜力。 而一个好的药品广告投放方案往往需要进行全方位的市场调研&…

Linux Debian12使用VSCode和Python搭建flask开发环境

一、安装VSCode 在Linux Debian12系统上安装VSCode教程可以参考网上相关教程。 二、安装Python 打开VSCode&#xff0c;安装python和python扩展包&#xff0c;如下图所示&#xff1a; 三、创建Python虚拟环境 1.新建文件夹testFlask 2.用vscode打开文件夹testFlask&#xf…

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

Jetpack Compose -> 声明式UI Modifier

前言 本章主要介绍下 Compose 的声明式 UI 以及初级写法&#xff1b; 什么是声明式UI 传统UI 传统 UI 方式来声明UI <androidx.appcompat.widget.LinearLayoutCompat android:layout_width"match_parent" android:layout_height"match_parent&quo…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

快递平台长期最低价格收费,需要寄快递享折扣优惠的请看这里 !

除了我们平时去菜鸟驿站寄快递或者在快递公司的官网上下单等方式外&#xff0c;我们还可以在我们平日使用的微信小程序中选择快递平台享受快递物流折扣。不用像其他主流快递公司想用优惠券一样下载官方APP。您还可以享受无忧特派送监管服务。今天给大家介绍一下我最常用的一款&…

鸿蒙开发已解决-Failed to connect to gitee.com port 443: Time out 连接超时提示

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

用通俗易懂的方式讲解:大模型微调方法总结

大家好&#xff0c;今天给大家分享大模型微调方法&#xff1a;LoRA,Adapter,Prefix-tuning&#xff0c;P-tuning&#xff0c;Prompt-tuning。 文末有大模型一系列文章及技术交流方式&#xff0c;传统美德不要忘了&#xff0c;喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

“所有伙食开销统计:轻松查看,智能管理你的餐饮支出“

你是否经常为伙食开销感到困扰&#xff0c;不知道如何有效控制和管理&#xff1f;现在&#xff0c;有了我们的伙食开销统计工具&#xff0c;这些问题将得到轻松解决&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账本并在上方功能栏里选择“查看方式”。并在弹出来的列表…

SpringBoot之优化高并发场景下的HttpClient并提升QPS

HttpClient优化思路 使用连接池&#xff08;简单粗暴&#xff09; 长连接优化&#xff08;特殊业务场景&#xff09; httpclient和httpget复用 合理的配置参数&#xff08;最大并发请求数&#xff0c;各种超时时间&#xff0c;重试次数&#xff09; 异步请求优化&#xff0…

gitlab导入/还原代码仓库(离线导入本地代码仓库及历史提交记录)

gitlab安装 在线 导入&#xff08;还原&#xff09;代码仓库 已有的代码代码可能托管于 GitHub、Bitbucket Cloud 、Bitbucket Server 、FogBugz 、Gitea 等平台&#xff0c;只要你有合适的权限&#xff0c;都可以使用 GitLab的在线导入功能直接从这些平台导入&#xff0c;如…

山西电力市场日前价格预测【2024-01-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-13&#xff09;山西电力市场全天平均日前电价为231.81元/MWh。其中&#xff0c;最高日前电价为345.71元/MWh&#xff0c;预计出现在00:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

声明式管理方法(yaml文件)

声明式管理方法&#xff08;yaml文件&#xff09; 声明式管理方法&#xff08;yaml文件&#xff09;&#xff1a; 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中声明 3、编辑好的yaml文件&#xff0c;还是要依靠陈述式的命令…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

计算机缺失msvcr100.dll如何修复?分享五种实测靠谱的方法

在计算机系统的日常运行与维护过程中&#xff0c;我们可能会遇到一种特定的故障场景&#xff0c;即系统中关键性动态链接库文件msvcr100.dll的丢失。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff…

增广路算法 DFS求解 最大网络流问题

最大网络流问题 最大网络流问题是这样的&#xff0c;有一个有向图&#xff0c;假定有一个源点&#xff0c;有一个汇点&#xff0c;源点有流量出来&#xff0c;汇点有流量进入&#xff0c;有向图上的边的权重为该条边可通过的最大流量(方向为边的方向)&#xff0c;问从源点到汇…

Servlet-Request

一、预览 在上一篇Servlet体系结构中&#xff0c;我们初步了解了怎么快速本篇将介绍Servlet中请求Request的相关内容&#xff0c;包括Request的体系结构&#xff0c;Request常用API。 二、Request体系结构 我们注意到我们定义的Servlet类若实现Servlet接口时&#xff0c;请求…

leetcode14. 最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 解题方法&#xff1a; 1.首先找到数组中长度最短的数据&#xff0c;与数组第一个数进行交换&#xff08;公共前缀的长度肯定不会大于列表中长度最短的字符串&#x…

MYSQL的操作

1.库的操作 1.1创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; #…

windows11通过虚拟机安装Ubuntu20.04

VMware 分为 VMware Workstation Pro 和 VMware Workstation Player, Pro体验期后收费&#xff0c;Player则免费。player 早期不能创建虚拟机&#xff0c;只能Pro创建好后给Player运行&#xff0c;而现在player早已加入创建虚拟机功能&#xff0c;所以使用体验上两者相差不大&a…