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

算法刷题【面试经典150题】

文章目录

  • 数组/字符串
    • 1.合并两个有序数组
    • 2.删除有序数组中的重复项(双指针)

数组/字符串

1.合并两个有序数组

在这里插入图片描述

法1:先将数组2合并到数组1,然后直接sort一下即可

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {// 法1for(int i = 0; i < n; i++){nums1[i+m] = nums2[i];}sort(nums1.begin(), nums1.end());}
};

法2:类似归并排序(使用双指针依次遍历两个数组)

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int i = 0, j = 0, k = 0;int arr[m+n];while(i < m && j < n){if(nums1[i] < nums2[j]) arr[k++] = nums1[i++];else arr[k++] = nums2[j++];}while(i < m){arr[k++] = nums1[i++];}while(j < n){arr[k++] = nums2[j++];}for(int i = 0;i < m + n; i++){nums1[i] = arr[i];}  }
};

法3:从后往前处理,可以优化空间复杂度
空间复杂度可以优化到o(1)
不会覆盖的原因主要是因为,本身nums1的个数是两个数组之和,如果nums1的数先填进去,那么它本身的位置就会空出来一个
nums1=[1,2,6,∗,∗,∗],nums2=[3,4,5]。这里 num1中的 6 是最大的,应当填入末尾。现在nums1=[1,2,∗,∗,∗,6],注意nums1[2] 这个位置现在空出了。然后把 nums2中的数字填入空位,得到 [1,2,3,4,5,6],没有任何错误覆盖。

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int idx = m + n - 1;int p1 = m - 1, p2 = n - 1;while(p1 >= 0 && p2 >= 0){if(nums1[p1] > nums2[p2]) nums1[idx--] = nums1[p1--];else nums1[idx--] = nums2[p2--];}while(p1 >= 0) nums1[idx--] = nums1[p1--];while(p2 >= 0) nums1[idx--] = nums2[p2--];}
};

2.删除有序数组中的重复项(双指针)

在这里插入图片描述
在这里插入图片描述
相等的元素在数组中的下标一定是连续的

/* 双指针
由于数组是有序的,那么重复的元素一定是相邻的
如果数组长度为0,数组不包含任何元素,返回0
如果数组长度大于0,至少包含一个元素,删除后也至少会有一个元素,因此从1开始删除重复元素即可
*/
class Solution {
public:int removeDuplicates(vector<int>& nums) {if(nums.size() <= 1) return nums.size();// l代表下一个不同元素要填入的下标位置,r表示遍历数组到达的下标位置int l = 1, r = 1;while(r < nums.size()){if(nums[r] != nums[r-1]){nums[l] = nums[r];l++;}// 无论是否重复,都要继续往后寻找r++;}return l;}
};
http://www.dtcms.com/a/311605.html

相关文章:

  • 技巧|SwanLab记录PR曲线攻略
  • 【Unity3D实例-功能-移动】小兵移动-通过鼠标点击进行
  • 【微实验】弦振动 MATLAB 物理模型 动画仿真
  • 腕管综合征 : “鼠标手”| “数字时代工伤”,在我国视频终端工作者中患病率达12%到15%。“
  • web:js的模块导出/导入
  • 【编号413】“一带一路”25个港口城市及其周边区域海岸线分类数据
  • 译|Netflix 数据平台运营中基于机器学习自动修复系统
  • 【网络与爬虫 38】Apify全栈指南:从0到1构建企业级自动化爬虫平台
  • 【Android】使用 Intent 传递对象的两种序列化方式
  • RPG增容2.尝试使用MMC根据游戏难度自定义更改怪物属性(三)
  • 推荐系统学习笔记(六)自监督学习
  • 【语音技术】意图与语料
  • gcc-arm-none-eabi安装后,找不到libgcc.a的拉置
  • 边缘计算优化!陌讯轻量化模型实现路面裂缝误检率↓78%
  • 【大模型LLM】大模型训练加速 - 深度混合精度训练(Mixed Precision Training)原理详解
  • 数字化生产管理系统设计
  • Leetcode 11 java
  • Agentic RAG:自主检索增强生成的范式演进与技术突破
  • ADB 查看 CPU 信息、查看内存信息、查看硬盘信息
  • 计算学习理论(PAC学习、有限假设空间、VC维、Rademacher复杂度、稳定性)
  • PHP 与 MySQL 详解实战入门(2)
  • Linux中使用Qwen模型:Qwen Code CLI工具
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(二)
  • JavaScript将String转为base64 笔记250802
  • 人工智能篇之计算机视觉
  • golang——viper库学习记录
  • 牛客 - 旋转数组的最小数字
  • 题单【模拟与高精度】
  • 先学Python还是c++?
  • 工具自动生成Makefile