力扣-第2天 双指针

力扣-14天算法入门

第1天 二分查找
第2天 双指针
第3天 双指针
第4天 双指针
第5天 双指针
第6天 滑动窗口
第7天 广度优先搜索 / 深度优先搜索
第8天 广度优先搜索 / 深度优先搜索
第9天 广度优先搜索 / 深度优先搜索
第10天 递归 / 回溯
第11天 递归 / 回溯
第12天 动态规划
第13天 位运算
第14天 位运算



前言

本系列文章是我的力扣刷题记录,采用c++进行编写


一、977. 有序数组的平方

难度(简单)
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

我这里采用双指针,因为我们可以观察到原数组是有序的,且经过平方后,大的数趋于两端,所有定义两端为两个指针,然后进行平方对比,最后返回大的数为数组末位。
具体代码如下:

class Solution {
    
    
public:
    vector<int> sortedSquares(vector<int>& nums) {
    
    
        int k = nums.size() - 1;
        vector<int> res(nums.size(), 0);//生成一个和nums一样大小的数组
        for (int i = 0, j = nums.size() - 1; i <= j;) {
    
     // 注意这里要i <= j,因为最后要处理两个元素
            if (nums[i] * nums[i] < nums[j] * nums[j])  {
    
    
                res[k--] = nums[j] * nums[j];
                j--;
            }
            else {
    
    
                res[k--] = nums[i] * nums[i];
                i++;
            }
        }
        return res;
    }
};

二、189. 旋转数组

难度(中等)
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

具体代码如下:

class Solution {
    
    
public:
    void rotate(vector<int>& nums, int k) {
    
    
        k = k % nums.size();//如3%7=3
        reverse(nums.begin(),nums.end());//用reverse()将区间[begin,end)内的元素全部逆序;即7 6 5 4 3 2 1 
        reverse(nums.begin(),nums.begin()+k);//(7 6 5 )逆置:5 6 7
        reverse(nums.begin()+k,nums.end());//(4 3 2 1)逆置:1 2 3 4
    }
};

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

おすすめ

転載: blog.csdn.net/CltCj/article/details/120299114