c++算法——数组

数组的题目不算是难题,锻炼的是代码的操控能力。

  1. 主要运用的方法:
    暴力解法就是for循环的嵌套使用
    双指针法
    滑动窗口
  2. 考察的题目:
    二分法排序、元素查找与删除、寻找最小子数组、螺旋矩阵等
    下文以题目分类来解释
  3. 二分法排序:
    在这里插入图片描述注意:记住循环不变量原则:每一次边界的处理都要根据区间的定义来确定。
    例如:
    左闭右开区间时,即初始化时定义left=0,right=nums.size(), while(left<right), middle = left+(right-left)/2;
    left = middle +1; right = middle;

    代码如下:
class Solution {
public:
   int search(vector<int>& nums, int target) {
       int left = 0, right = nums.size();
       int mid = 0;
       while(left<right){
           mid = left+((right-left)/2);
           if(nums[mid]>target){
               right = mid;
           }
           else if(nums[mid]<target){
               left = mid + 1;
           }
           else if(nums[mid]==target){
               return mid;
           }
       }
       return -1;
   }
};

左闭右闭时,即初始化时定义left =0; right = nums.size()-1;
while(left<=right), middle = left+(right-left)/2;
left = middle +1; right = middle-1; 相关更改根据上述代码可完成。

  1. 移除元素
    (1)leetcode 题目地址:
    https://leetcode-cn.com/problems/remove-element/
    在这里插入图片描述快慢指针解法:
    (知道是使用快慢指针解决原地更改数组元素,但是具体细节也有技巧):后一元素覆盖前一元素,判断快指针元素不等于目标值时,快指针+1,慢指针不动,快指针跳过相等值时,快指针元素赋值给慢指针元素。
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowindex = 0, fastindex = 0;
        int i = nums.size();
        for(fastindex = 0 ; fastindex < i ; fastindex++){
            if(nums[fastindex] != val){
                nums[slowindex++]=nums[fastindex];
            }
        }
        return slowindex;
    }
};

(2)leetcode 题目地址:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
在这里插入图片描述
快慢指针解法:
两个判断:当快慢指针元素相等时,快指针+1;直至不等,慢指针+1,再将快指针元素赋值给慢指针元素。要注意的是,容易忽略输入是一个空数组的情况,加一个判断。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int slowindex = 0, fastindex = 0;
        if(nums.size() == 0){
            return 0;
        }
        while(fastindex < nums.size()){
            if(nums[slowindex] == nums[fastindex]){
                fastindex++;                
            }
            else if(nums[slowindex] != nums[fastindex]){
                slowindex++;
                nums[slowindex] = nums[fastindex];
            }
        }
        return slowindex+1;
    }
};
  1. 有序数组的平方,输出仍然有序
    leetcode 题目地址:
    https://leetcode-cn.com/problems/squares-of-a-sorted-array/
    在这里插入图片描述
    正常思路就是先平方后排序,前文使用的二分法并不适合,因为可能在平方之后有重复元素的出现。
    这里依然可以使用双指针解法,快指针指向末尾,慢指针指向第一个元素,对比大小,大的从后往前赋值给容器,因为平方后,大数是在数组的头部或者尾部
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int len = nums.size();
        vector<int> result(len, 0);  //定义一个容器,因为数组的初始化不允许有变量,不可以用数组去接排序后的结果
        int fastindex = len-1, slowindex = 0, a = len-1;
        while(slowindex <= fastindex){   //这里要有等号
            if(nums[fastindex]*nums[fastindex] >= nums[slowindex]*nums[slowindex]){
                result[a] = nums[fastindex]*nums[fastindex];
                fastindex--;
                a--;
            }
            else{
                result[a] = nums[slowindex]*nums[slowindex];
                slowindex++;
                a--;
            }
        }
        return result;
    }
};
  1. 滑动窗口寻找最小子数组
    leetcode 题目地址:
    https://leetcode-cn.com/problems/minimum-size-subarray-sum/
    在这里插入图片描述
    快慢指针解法:
    慢指针为0,遍历快指针,找中间元素记录最小长度值
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int slowindex = 0, fastindex = 0, sum = 0, a = nums.size()+1 ;
        int len = 0;
        for(fastindex = 0; fastindex < nums.size(); fastindex++){
            sum += nums[fastindex];
            while(sum>=target){
                len = fastindex-slowindex+1;
                sum -= nums[slowindex];
                slowindex++;
                if(len < a){  //记录最小长度
                    a = len;
                }
            }
        }
        return a == nums.size()+1? 0 : a; //判断没有改变长度时,没有最小子数组,输出0  用“==”
    }
};
  1. 生成顺时针螺旋排序数组
    leetcode 题目地址:
    https://leetcode-cn.com/problems/spiral-matrix-ii/
    在这里插入图片描述
    这题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
    像二分法一样,始终注意循环不变量原则,即始终左闭右闭,或者左闭右开
    下图是左闭右开,循环

    在这里插入图片描述
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n,0)); //输出n*n的正方形矩阵
        int startx = 0, starty = 0;  //横纵起始元素
        int loop = n/2, mid = n/2;  //循环次数、中间点坐标
        int offset = 1; //控制一行输出个数
        int count = 1;  //赋值
        while(loop--){
            int i = startx;
            int j = starty;
            for(j; j < n + starty -offset; j++){  //左闭右开,如果n=3,则赋值result[0][0]\result[0][1]
                result[i][j]=count++;
            }
            for(i; i <n + startx - offset; i++){
                result[i][j] = count++;
            }
            for( ; j > startx; j-- ){
                result[i][j] = count++;
            }
            for( ; i > starty; i--){
                result[i][j] = count++;
            }
            offset += 2;  //每进行一圈循环,可赋值的位置-2
            startx++;  //每进行一圈循环,起始位置+1
            starty++;
        }
        if(n%2 != 0){  //当n为奇数,中间位置单独赋值
            result[mid][mid] = count;
        }
        return result;
    }
};
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这个问题中,用户提供了两段代码,分别是引用\[1\]和引用\[2\]。这两段代码都是用来在一个数组中查找指定数的位置。 引用\[1\]是一个C++代码示例,它使用了iostream和stdio.h头文件,并使用了命名空std。代码中使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量t,并跳出循环。最后,根据t的值输出结果。 引用\[2\]是另一个C代码示例,它使用了stdio.h头文件。代码中同样使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量count,并将flag设置为1,表示找到了。最后,根据flag的值输出结果。 综上所述,这两段代码都是用来在一个数组中查找指定数的位置。它们的实现方式略有不同,但都能达到相同的目的。 #### 引用[.reference_title] - *1* [1143: 零起点学算法50——数组中查找数](https://blog.csdn.net/weixin_43965597/article/details/113104995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [问题 C: 零起点学算法82——数组中查找数](https://blog.csdn.net/chenhannan0024/article/details/127568844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值