当前位置: 首页 > news >正文

leetcode热门100题1-4

第一天

两数之和

//暴力枚举
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (nums[i] + nums[j] == target) {return {i, j};}}}return {};}
};
# python
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n = len(nums)for i in range(n):for j in range(i + 1, n):if nums[i] + nums[j] == target:return [i, j]return []
  1. 字母异位词分组
class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:mp={}for st in strs:key=''.join(sorted(st)) #  str 字符串型print(type(key))print(type(sorted(st)))if key not in mp:mp[key]=[]mp[key].append(st)return list(mp.values())
//  排序 哈希
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string ,vector<string> > mp;for(string &str: strs){string key=str;sort(key.begin(),key.end() );// 排序mp[key].push_back(str);}vector<vector<string> >ans;for(auto it=mp.begin(); it!=mp.end();++it){ans.push_back( it->second);// it 是 map(key,value)  first second}return ans;}};
  1. 最长连续序列

对于匹配的过程,暴力的方法是 O(n)
遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(1) 的时间复杂度。

# python 前一个数字没有 即可看下一个
class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest = 0num_set = set(nums)for num in num_set:if num - 1 not in num_set:  # 前一个数字current_num = numcurrent_streak = 1while current_num + 1 in num_set:current_streak += 1current_num += 1longest = max(longest, current_streak)return longest
//c++
class Solution {
public:int longestConsecutive(vector<int>& nums) {// 去重unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longest=0;for (const int &num:num_set){if(!num_set.count(num-1)){int currentnum=num;int current=1;while(num_set.count(currentnum+1)) {currentnum+=1;current+=1;}longest=max(longest,current);}}return longest;}
};

std::unordered_set 的默认迭代器是一个常量迭代器,因此不能绑定到 int&
num_set 的迭代器类型是 const int(默认行为)
std::unordered_set 中的元素是不可修改的,因为哈希值依赖于元素的值。

  1. 移动零
    右指针一直走 左指针非零时与左指针交换
class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size(), left = 0, right = 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left++;}right++;}}
};

http://www.mrgr.cn/news/83071.html

相关文章:

  • AI大模型-提示工程学习笔记5-零提示
  • AIGC是什么?怎么用?简单三步ToDesk云电脑快速用
  • 基于Query去索引Doc:实现高效且精准的商品召回
  • vulnhub靶场【DC系列】之7
  • 海陵HLK-TX510人脸识别模块 stm32使用
  • Matlab仿真径向受压圆盘光弹图像
  • 生成模型:变分自编码器-VAE
  • 导航技术的分类
  • 创建型模式-原型模式
  • MySQL笔记大总结20250108
  • GDPU Android移动应用 重点习题集
  • 联邦学习LoRA:推理合并权重公式:以及变体
  • uni-app 资源引用(绝对路径和相对路径)方法汇总
  • 【网络协议】开放式最短路径优先协议OSPF详解(四)
  • 25/1/4 算法笔记<强化学习> 生成对抗模仿学习
  • 【C语言】_指针与数组
  • “深入浅出”系列之FFmpeg:(1)音视频开发基础
  • 【网络协议】IPv4 地址分配 - 第二部分
  • 【51单片机】02LED流水灯实验
  • 【网络协议】静态路由详解
  • Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)
  • Unity中 Xlua使用整理(二)
  • c语言———标准IO fgetc fputc fprintf fscanf【内附练习及代码】
  • 一、二极管(应用篇)
  • docker一键安装脚本(docker安装)
  • OSPF - 1类LSA(Router-LSA)