首页 > 编程语言 >算法刷题记录(day1)

算法刷题记录(day1)

时间:2024-10-25 19:20:02浏览次数:3  
标签:map right nums res day1 算法 vector left 刷题

 前言 

之前在LeetCode上断断续续刷了几百道题,但是很多题可能过一段时间后又忘了,打算从今天开始尽量保持每天刷题,同时记录下自己的刷题过程和对题目的理解,方便自己进行总结和复习。

LC15.三数之和

题目描述:给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

解题思路:先用sort将数组进行排序(基于快排,时间复杂度O(logn)),遍历数组,首个元素下标为i,若nums[i] > 0,则直接返回。选取i的下一个位置以及数组最后一个位置,根据三个元素之和判断下标移动方式。注意代码里面的去重部分。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;

        sort(nums.begin(), nums.end()); //先从小到大进行排序

        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0) return res;    //第一个大于0,相加不可能为0

            if (i > 0 && nums[i] == nums[i - 1]) continue;  //去重

            int left = i + 1;
            int right = nums.size() - 1;

            while (left < right) {
                if (nums[i] + nums[left] + nums[right] > 0) right--;
                else if (nums[i] + nums[left] + nums[right] < 0) left++;
                else {
                    res.push_back(vector<int>{nums[i], nums[left], nums[right]});
                    while (left < right && nums[left] == nums[left + 1]) left++;    //去重
                    while (left < right && nums[right] == nums[right - 1]) right--; //去重
                    left++;
                    right--;    
                }
            }
        }
        return res;
    }  
};

 LC1.两数之和

题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

解题思路:使用哈希表解决的经典题目,以数组值为键,下标为值,查找有无满足相加为target的两个数。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++) {
            auto it = map.find(target - nums[i]);
            if (it != map.end()) return {it->second, i};    //查找到直接返回下标
            map.insert(pair<int, int>{nums[i], i});
        }
        return {};
    }
};

 LC49.字母异位词分组

题目描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

解题思路:利用sort排序,再用哈希表存储有相同字母的元素,相当于用键值对来记录,使用unordered_map,最后遍历哈希表得到输出数组。

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> map;
        
        for (auto& s : strs) {
            string temp = s;
            sort(temp.begin(), temp.end());
            map[temp].push_back(s);
        }

        vector<vector<string>> res;

        for (auto& s : map) {
            res.push_back(s.second);
        }

        return res;
    }
};

 LC128.最长连续序列

题目描述:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

解题思路:用哈希表记录数组里面的所有值(只记录值,用unordered_set),找到一个连续序列的起始位置(只需要判断当前元素),通过一个循环来记录连续序列的长度,最后和现有的res进行比较,选取最大值。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> set(nums.begin(), nums.end());
        int res = 0;    //记录输出结果
        for (int i : set) {
            if (!set.count(i - 1)) {    //确保是从i开始的
                int x = i + 1;
                while (set.count(x)) x++;   //记录连续的个数
                res = max(res, x - i);  //记录最大值
            }
        }
        return res;
    }
};

标签:map,right,nums,res,day1,算法,vector,left,刷题
From: https://blog.csdn.net/Ackerman273/article/details/143240288

相关文章

  • 【强化学习】—— Q-learning算法
    Q-Learning算法Q-learning是一种无模型的强化学习算法,用于寻找最优策略以最大化累积奖励。它通过学习一个状态-动作值函数Q(s,......
  • 打卡信奥刷题(114)用C++工具信奥P1145[普及组/提高] 约瑟夫
    约瑟夫题目描述nnn个人站成一圈,从某个人开始数数,每次数到mmm的......
  • 程序员现在应该钻研算法还是prompt能力
    标题:程序员现在应该钻研算法还是prompt能力摘要:1、算法与prompt能力,两者在当今编程领域均占据了极为重要的地位。算法作为解决问题的基础,强调逻辑思维与高效实现;而prompt能力,则关乎于与先进AI系统的交互,强调理解与指令的准确传达。本文旨在探讨程序员应如何在算法与prompt能力间......
  • 蓝桥首场算法团队战2024.10.24 题解(1~5)
    蓝桥首场算法团队战2024.10.24题解1:不同角度【算法赛】题意:给定自然数S,需要找出一个自然数T。使得数字T>数字S并且S和T转化为字符串后,满足S的字典序>T的字典序。T一定存在,找出符合条件且字典序最小的T。输入:第一行一个整数t,表示t组测试用例。\((......
  • 算法题——执行操作可获得的最大总奖励
    3181.执行操作可获得的最大总奖励题干给你一个整数数组rewardValues,长度为n,代表奖励的值。最初,你的总奖励x为0,所有下标都是未标记的。你可以执行以下操作任意次:从区间[0,n-1]中选择一个未标记的下标i。如果rewardValues[i]大于你当前的总奖励x,则将rewar......
  • 全面了解 NGINX 的负载均衡算法
    NGINX提供多种负载均衡方法,以应对不同的流量分发需求。常用的算法包括:最少连接、最短时间、通用哈希、随机算法和IP哈希。这些负载均衡算法都通过独立指令来定义,每种算法都有其独特的应用场景。以下负载均衡方法(IP哈希除外)适用于HTTP、TCP和UDP上游池:轮询轮询(Ro......
  • K-近邻算法(KNN)
    """K-近邻算法用于分类和回归问题。比如,判断一款游戏是否受欢迎。KNN算法的基本思想是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某个类别,则该样本也属于这个类别。KNN算法的实现方法有两种:1.基于欧氏距离的KNN算法2.基于余弦相似度的KNN算法KNN算法的优点:1.简......
  • 算法设计实验6
    p1249有一个8*8的棋盘,行号、列号均为0-7,一个特殊放个的位置是(5,6),给出采用L形骨牌覆盖其他全部方格的一种方案1#include<ostream>2#include<iostream>3#defineMAX_SIZE84usingnamespacestd;5intk;6intx,y;7intboard[MAX_SIZE][MAX_SIZE];8int......
  • 【数据结构和算法】一、算法复杂度:时间复杂度和空间复杂度)
    目录1、算法复杂度1.1概念1.2评价指标1.3时间复杂度1.3.1什么是时间复杂度1.3.2常数阶O(1)1.3.3  线性阶O(n)1.3.4 对数阶O(logN)1.3.5  线性对数阶O(nlogN)1.3.6 平方阶O(n²)1.3.7  立方阶O(n³)、K次方阶O(n^k)1.4 空间复杂度1.4.1 空间复......
  • 数据结构图的最短路径-弗洛伊德算法(有向图+数据结构课本C++代码一比一转C语言+邻接矩
    弗洛伊德算法有向图代码如下:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<limits.h>#defineMaxInt32767#defineMVNum100intPath[MVNum][MVNum];//存放前驱索引的intD[MVNum][MVNum];//存放当前已知的权值//图的邻接......