代码随想录算法训练营第二天|有序数组的平方、螺旋矩阵、补移除元素

一、移除元素

1.1题目

leetcode27 27. 移除元素 - 力扣(LeetCode)

题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。

返回 k

1.2解题思路

1.2.1暴力求解

先用遍历找一个与val值相同的元素,然后再用一个遍历将其后面的元素全部向前移一格,最后返回数组种的元素数量。

1.2.2 双指针求解

定义两个指针,一个指针作为循环变量,每次循环都会加1,叫做快指针,另一个指针在符合条件的情况下才加一,叫做慢指针。

1.3 代码实现

1.3.1 暴力求解代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size= nums.size();
        for(int i=0;i<size;i++)
        {
            if(val==nums[i])
            {
                for (int j=i+1;j<size;j++)
                {
                    nums[j-1]=nums[j];
                }
                size--;
                i--;
            }
        }
        return size;

    }
};

1.3.2 双指针求解代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size =nums.size();
        int slowindex=0;
        for(int fastindex=0;fastindex<size;fastindex++)
        {
            if(nums[fastindex] !=val)
            {
                nums[slowindex++]=nums[fastindex];
            }
        }
        return slowindex;

    }
};

二、有序数组的平方

题目:977. 有序数组的平方 - 力扣(LeetCode)

对于这个题目,我的想法就是把所有的元素直接平方后,然后上sort函数就行

2.1 sort函数:

1.sort()函数,使用原地算法对数组进行排序,如果不传入参数,则数组按照元素的字典序升序排列。

2.如果传入的是排列函数,形式为sort((a,b)=>{}),a和b为每次比较值,a和b的顺序根据排列函数的形式返回值决定:

1.返回正数(不含0),则a在b后

2.返回0,则a和b相对位置不变

3.返回的为负数,则a在b的前面;

2.2 代码

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

    }
};

三、螺旋矩阵

3.1 概念

螺旋矩阵涉及的算法不多,就是一个模拟转圈的问题。题目:59. 螺旋矩阵 II - 力扣(LeetCode)

思路:模拟这个正方形生成的过程,遵从左闭右开原则;画的圈数为n/2,例如n=3,画3/2=1个圈,n=4,画4/2=2个圈,n为奇数时,最后要在中间赋值一个n^n,并且位置为[n/2,n/2];
每一个圈有四个循环,每循环一次,最开始的位置都要+1。

3.2 代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>mat(n,vector<int>(n,0));
        //startx=sx,starty=sy
        int sx=0,sy=0;//初始位置
        int loop=n/2;//转圈数
        int offset=1;//末尾的位置
        int count=1;
        int i,j;
        while(loop--){
            i=sx;
            j=sy;
            for(;j<n-offset;j++)
            {
                mat[i][j]=count++;
            }
            for(;i<n-offset;i++)
            {
                mat[i][j]=count++;
            }
            for(;j>sx;j--)
            {
                mat[i][j]=count++;
            }
            for(;i>sy;i--)
            {
                mat[i][j]=count++;
            }
            offset++;
            sx++;
            sy++;
        }
        if(n%2 == 1)
        {
            mat[n/2][n/2]=n*n;
        }
        return mat;

    }
};

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值