代码随想录刷题-数组双指针

简介: 代码随想录刷题-数组双指针

算法刷题-数组

27. 移除元素-双指针

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路

双指针:

定义两个指针:慢指针和快指针 ,慢指针指向最终需要返回的结果,快指针指向走在前面的元素

如果快指针位置的值!=val ,那么就给慢指针,同时慢指针+1。

代码

    int removeElement(vector<int>& nums, int val) {
   
        int n=nums.size();
        int slow=0,fast=0;
        for(;fast<n;fast++){
   
            if(nums[fast]!=val){
   
                nums[slow++]=nums[fast];
            }
        }     
        return slow;
    }

26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k

思路

双指针,遍历一次数组,每次把当前元素nums[i]放入到结果中,然后指针往后走,直到和当前元素不同,此时再进行赋值i=j-1

代码

    int removeDuplicates(vector<int>& nums) {
   
        int pos=0;
        for(int i=0;i<nums.size();i++){
   
            int j=i;
            while(j<nums.size() && nums[j]==nums[i]) j++;
            nums[pos++]=nums[i];
            i=j-1;
        }
        return pos;
    }

283. 移动零-双指针

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

思路

双指针:

可以转换为:将所有非0的数字都放在前面,并且保持顺序不变

快指针走在前面,每次遇到非0的数就给慢指针,直到结束

最后再让慢指针走完,把剩下的都赋值为0即可。

代码

    void moveZeroes(vector<int>& nums) {
   
        int n=nums.size();
        int pos=0;
        for(int i=0;i<n;i++){
   
            int j=i;
            while(j<n &&nums[j]==0) j++;
            if(j<n) nums[pos++]=nums[j];
            i=j;
        }
        while(pos<n) nums[pos++]=0;
    }

844. 比较含退格的字符串-栈

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true# 代表退格字符。

思路

直接模拟即可:

如果遇到字符,压入栈中

如果不是字符,并且栈中有元素,那么就弹出来。

也可以使用双指针。

代码

    bool backspaceCompare(string s, string t) {
   
        string x, y;
        for (auto c: s) {
   
            if (c == '#') {
   
                if (!x.empty()) x.pop_back();
            } else x.push_back(c);
        }
        for (auto c: t) {
   
            if (c == '#') {
   
                if (!y.empty()) y.pop_back();
            } else y.push_back(c);
        }
        return x == y;
    }

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

题目

把每个数平方之后排个序即可

或者可以 使用 双指针,最大值只会 产生在 两边,每次只需要 从两边选 较大的即可。

代码

排序

    vector<int> sortedSquares(vector<int>& nums) {
   
        for(int i=0;i<nums.size();i++) nums[i]=nums[i]*nums[i];
        sort(nums.begin(),nums.end());
        return nums;
    }

双指针:

    vector<int> sortedSquares(vector<int>& nums) {
   
        int n=nums.size();
        vector<int> res(n);
        for(int i=0;i<n;i++) nums[i]=nums[i]*nums[i];
        for(int l=0,r=n-1,pos=n-1;l<=r;){
   
            if(nums[l]>nums[r]) res[pos--]=nums[l++];
            else res[pos--]=nums[r--];
        }
        return res;
    }
相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
36 3
|
18天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
23天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
23天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
23天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
26天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
48 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
42 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
2月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。