腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口

news2024/9/21 21:55:50

之前总结过字节跳动TOP50算法面试题:

字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题

目录

双指针

42.接雨水 

283.移动零 

11.盛最多水的容器

15.三数之和 

哈希

1. 两数之和

49.字母异位词分组

128.最长连续序列 

滑动窗口

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

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


双指针

42.接雨水 

用单调栈再做一遍吧……

class Solution {
public:
    int trap(vector<int>& height) {
        //当前柱子如果小于等于栈顶元素,说明形不成凹槽,则将当前柱子入栈;
        //反之若当前柱子大于栈顶元素,说明形成了凹槽,于是将栈中小于当前柱子的元素pop出来,将凹槽的大小累加到结果中。
        int ans = 0;
        stack<int> sta;
        for (int i = 0; i < height.size(); i++) {
            while (!sta.empty() && height[i] > height[sta.top()]) {
                int top = sta.top();
                sta.pop();
                if (sta.empty()) {
                    break;
                }
                int left = sta.top();
                int w = i - left - 1;
                int h = min(height[i], height[left]) - height[top];
                ans += w * h;
            }
            sta.push(i);
        }
        return ans;
    }
};

283.移动零 

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 双指针
        // 左指针指向当前已经处理好的序列的尾部
        // 右指针指向待处理序列的头部
        // 每次交换都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变
        int left = 0;
        int right = 0;
        while (right < nums.size()) {
            if (nums[right] != 0) {
                swap(nums[left], nums[right]);
                left ++;
            }
            right ++;
        }
        return;
    }
};

11.盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0;
        int right = height.size() - 1;
        int ans = 0;
        while (left < right) {
            int minheight = min(height[left], height[right]); //盛水取决于最短的线
            ans = max(ans, (minheight * (right - left)));
            if (height[left] < height[right]) { // 移动短的线
                left ++;
            } else {
                right --;
            }
        }
        return ans;
    }
};

15.三数之和 

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        // 排序后用双指针查找
        vector<vector<int> > ans;
        sort(nums.begin(), nums.end());
        int left, right;
        for (int i = 0; i < nums.size() - 1; i++) {
            if (nums[i] > 0) {
                continue;
            }
            left = i + 1;
            right = nums.size() - 1;
            while (left < right) {
                if ((nums[i] + nums[left] + nums[right]) == 0) {
                    ans.push_back({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 --;
                } else if ((nums[i] + nums[left] + nums[right]) > 0) {
                    right --;
                } else {
                    left ++;
                }
            }
            // i 下标也需要去重
            while (i + 1 < nums.size() && nums[i] == nums[i + 1])
                i++;
        }        
        return ans;
    }
};

哈希

1. 两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans;
        unordered_map<int, int> m;
        for (int i = 0; i < nums.size(); i++) {
            if (m.find(nums[i]) != m.end()) {
                return {m[nums[i]], i};
            }
            m[target - nums[i]] = i;
        }
        return ans;
    }
};

49.字母异位词分组

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> ans;
        // 哈希表存储
        unordered_map<string, vector<string> > m; 
        for (auto s : strs) {
            string key = s;
            // 排序后所有异位词存在唯一key
            sort(key.begin(), key.end());
            m[key].push_back(s);
        }
        for (auto it = m.begin(); it != m.end(); it++) {
            ans.push_back(it->second);
        }
        return ans;
    }
};

128.最长连续序列 

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        // 用哈希表存储是否出现过的数字
        unordered_set<int> hash;
        int ans = 0;
        for (auto num : nums) {
            hash.insert(num);
        }
        for (auto x : hash) {
            // 如果当前数字前面没有出现过数字,则从当前位置开始查
            // 因为如果前一个数字出现过, 那么他已经被查找过了
            if (!hash.count(x - 1)) {
                int y = x;
                // 一直往后查找连续的序列
                while (hash.count(y + 1)) {
                    y++;
                }
                // 维护最大的ans
                ans = max(ans, y - x + 1);
            }
        }
        return ans;
    }
};

滑动窗口

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

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // 滑动窗口
        int left = 0;
        int right = 0;
        int ans = 0;
        // 记录窗口
        unordered_map<char, int> windows;
        while (right < s.size()) {
            char c = s[right];
            right ++;
            windows[c] ++;
            // 收缩窗口
            while (windows[c] > 1) {
                char d = s[left];
                left ++;
                windows[d] --;
            }
            // 维护最大ans
            ans = max(right - left, ans);
        }
        return ans;
    }
};

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

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ans;
        // 滑动窗口
        int left = 0;
        int right = 0;
        int count = 0;
        // 当前窗口中的字符和需要凑齐的字符
        unordered_map<char, int> windows, need;
        // 需要凑齐的字符
        for (auto c : p) {
            need[c] ++;
        }
        while (right < s.size()) {
            // 向右滑动
            char c = s[right];
            right ++;
            // 进行窗口内数据更新
            if (need.count(c)) {
                windows[c] ++;
                if (windows[c] == need[c]) {
                    count ++;
                }
            }
            // 左侧收缩窗口
            while (right - left >= p.size()) {
                if (count == need.size()) {
                    ans.push_back(left);
                }
                char d = s[left];
                left ++;
                // 窗口内数据更新
                if (need.count(d)) {
                    if (windows[d] == need[d]) {
                        count --;
                    }
                    windows[d] --;
                }
            }
        }
        return ans;
    }
};

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

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

相关文章

2024 RSTCONCTF re 部分wp

Unknown Architect DIE查看&#xff0c;RISC_V架构&#xff0c;直接交即可 Duke of the Kingdom 附件拖入jadx 比较简单。脚本 Keypad 附件拖入ida。一共四遍check&#xff0c;都比较简单 Pico-Cypher 文本编辑器打开附件 稍微问一问gpt&#xff0c;得知这是micropython&#x…

数据驱动型营销与开源 AI 智能名片 O2O 商城系统的融合发展

摘要&#xff1a;本文探讨了数据驱动型营销在现代商业中的重要性&#xff0c;阐述了其在消费者管理和产品管理方面的作用。同时&#xff0c;引入“开源 AI 智能名片 O2O 商城系统”&#xff0c;分析其如何与数据驱动型营销相结合&#xff0c;为企业提供更精准的营销决策和更高效…

【Matlab 肌电信号分析】

一、数据预处理 1.1 数据读取 使用matlab从rhd文件中读取原始数据&#xff0c;共64个通道。 1.2 数据滤波 使用 60Hz的Notch filter 和150Hz的高通Butterworth滤波器进行降噪 二、波峰提取 > 每个通道分别根据相应的规则提取出波峰、波谷附近的波形。 三、信号聚类 3.1 降…

win7桌面显示我的电脑,控制面板等

win7桌面显示我的电脑&#xff0c;控制面板等 点击windows图标&#xff0c;一般左下角 右键计算机 选择在桌面显示即可&#xff0c;控制面板也是一样的操作

可自动完成固化、繁琐、重复的工作流程,提高工作效率的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

1.4 计算机网络的性能指标

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、速率二、带宽三、吞吐量四、时延五、时延带宽积六、往返时延&#xff08;RTT&#xff09;七、利用率 前言 计算机网络的性能指标是评估网络效率和效果的关键&#xf…

React学习day07-ReactRouter-抽象路由模块、路由导航、路由导航传参、嵌套路由、默认二级路由的设置、两种路由模式

14、ReactRouter续 &#xff08;2&#xff09;抽象路由模块 1&#xff09;新建page文件夹&#xff0c;存放组件 组件内容&#xff1a; 2&#xff09;新建router文件夹&#xff0c;在其下创建实例 3&#xff09;实例导入&#xff0c;使用 4&#xff09;效果 &#xff08;3&…

CAD图纸加密软件哪个好?10款2024主流CAD图纸加密软件分享!

随着信息安全意识的增强&#xff0c;特别是在工程设计、建筑和制造等领域&#xff0c;保护CAD图纸的安全成为一项重要任务。选择合适的CAD图纸加密软件不仅能确保数据安全&#xff0c;还能提高企业的合规性。以下是2024年主流的10款CAD图纸加密软件&#xff0c;每款软件均有独特…

floodfill算法(二)

目录 一、太平洋大西洋水流问题 1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 3. 解法 &#x1f334;算法思路&#xff1a; &#x1f334;算法代码&#xff1a; 二、扫雷游戏 1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xf…

Java8的Optional简介

文章目录 环境背景方法1&#xff1a;直接获取方法2&#xff1a;防御式检查方法3&#xff1a;Java 8的Optional概述map()测试 flatMap()测试 总结参考 注&#xff1a;本文主要参考了《Java 8实战》这本书。 环境 Ubuntu 22.04jdk-17.0.3.1 &#xff08;兼容Java 8&#xff09; …

samba配置

首先需要在linux上使用命令sudo apt install samba安装samba功能&#xff0c;安装之后&#xff0c;使用命令sudo smbpasswd -a zxy添加samba的密码&#xff0c;我这里使用的是和ubuntu的登陆密码&#xff0c;然后需要编辑samba相关的功能&#xff0c;使用命令sudo vim /etc/sam…

通信工程学习:什么是AN-SMF接入网系统管理功能

AN-SMF接入网系统管理功能 AN-SMF&#xff08;Access Network System Management Function&#xff0c;即接入网系统管理功能&#xff09;是通信网络中接入网&#xff08;AN&#xff09;的一个重要组成部分&#xff0c;主要负责协调和管理接入网内的各种功能和资源。以下是对AN…

【Android Studio】app:compileDebugJavaWithJavac FAILED解决办法

文章目录 问题描述解决办法 问题描述 Task :app:compileDebugJavaWithJavac FAILED The following annotation processors are not incremental: jetified-butterknife-compiler-10.0.0.jar (com.jakewharton:butterknife-compiler:10.0.0). Make sure all annotation processo…

启动windows更新/停止windows更新,电脑自动更新怎么彻底关闭?如何操作?

关于启动Windows更新、停止Windows更新以及彻底关闭电脑自动更新的问题&#xff0c;以下是根据专业角度提供的详细指导&#xff1a; 启动Windows更新 1.通过Windows设置启动更新&#xff1a; -点击开始菜单&#xff0c;选择“设置”&#xff08;或使用快捷键WinI&a…

主流的Java的webapi接口模板特点分析

Java 作为一种广泛应用于企业级开发的编程语言&#xff0c;其在 Web API 开发中具有重要的地位。随着 Java 生态系统的不断发展&#xff0c;市面上涌现了多种不同的 Web API 框架和设计模式。不同的 Web API 模板在设计上各有特点&#xff0c;适合不同类型的开发需求。本文将详…

明月皎皎,思念悠悠 孙滢迎深情演唱《月亮与笆篓》

明月皎皎&#xff0c;思念悠悠 孙滢迎深情演唱《月亮与笆篓》 在中秋佳节的月光下&#xff0c;一首满含对妈妈思念的歌曲《月亮与笆篓》&#xff0c;如同一缕轻柔的晚风&#xff0c;悄然拂过心间&#xff0c;勾起无尽的回忆与眷恋。 该歌曲由全国机关事务管理研究会。徐进作词…

2022高教社杯全国大学生数学建模竞赛C题 问题一(3) Python代码

目录 1.3 根据风化点检测数据,预测其风化前的化学成分含量数据重塑数据可视化回归随机森林回归XGboost回归Gradient Boosting回归LightGBM回归CatBoost回归决策树回归MLP回归预测数据复原1.3 根据风化点检测数据,预测其风化前的化学成分含量 数据重塑 import numpy as npdf=…

『功能项目』第二职业法师的平A【57】

我们打开上一篇56制作提示主角升级面板的项目&#xff0c; 本章要做的事情是制作法师平A的魔法球触碰到Boss后让Boss受到一个无视攻击力与防御力的一个&#xff08;100&#xff09;左右随机的一个伤害值 修改脚本&#xff1a;PlayerCtrl.cs 将法师职业生成的魔法球的标签Tag设…

Java4----String

一、概述 java.lang.String 类代表字符串&#xff0c;Java程序中所有字符串文字都为此类 注意&#xff1a; 字符串内容是不会发生改变的&#xff0c;它的对象在创建后不能被更改 比如&#xff1a; String name "666"; name "8wx"; 这是两个字符串 java程…

通信工程学习:什么是HFC混合光纤同轴电缆

HFC&#xff1a;混合光纤同轴电缆 HFC&#xff08;Hybrid Fiber Coaxial&#xff09;混合光纤同轴电缆是一种结合了光纤与同轴电缆的宽带接入网技术。以下是对HFC混合光纤同轴电缆的详细解释&#xff1a; 一、HFC混合光纤同轴电缆的定义与概述 定义&#xff1a;HFC是一种结合光…