【剑指offer|图解|双指针】训练计划 I + 查找总价格为目标值的两个商品

文章目录

  • 前言
  • 一. ⛳️训练计划 I
  • 二. ⛳️查找总价格为目标值的两个商品
  • 结尾


前言

博客主页:@聆风吟的个人主页

系列专栏:本期文章收录在《剑指offer每日一练》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!

作者留言:文章创作不易,可能会有些地方出现错误,还希望广大读者们能够帮忙指出,让我们大家一起共同进步。

☁️寄语:少年有梦不应止于心动,更要付诸行动。



一. ⛳️训练计划 I

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

题目:
教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。

示例:

输入: actions = [ 1, 2, 3, 4, 5 ]
输出: [ 1, 3, 5, 2, 4 ]
解释: 正确答案不为一

限制:

  • 0 <= actions.length <= 50000
  • 0 <= actions[i] <= 10000

解题思路:
采用双指针
定义双指针 leftright 分别位于数组的两端,循环执行:

  1. 指针 left 从左向右寻找偶数;
  2. 指针 right 从右向左寻找奇数;
  3. 将指针 left 找到的偶数与指针 right 找到的奇数进行交换。

【剑指offer|图解|双指针】训练计划 I + 查找总价格为目标值的两个商品_第1张图片

c++代码:

class Solution {
public:
    vector<int> trainingPlan(vector<int>& actions) {
        int sz = actions.size();

        int l = 0;//左指针
        int r = sz -1;//右指针
        while(l < r){
            while(l < r && actions[l] % 2 != 0) l++;//从左向右找首个偶数
            while(l < r && actions[r] % 2 == 0) r--;//从右向左找首个奇数
            swap(actions[l], actions[r]);//交换
        }

        return actions;
    }
};

二. ⛳️查找总价格为目标值的两个商品

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

题目:
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例:

输入: price = [ 3, 4, 12, 15 ], target = 16
输出: [ 4, 12 ] 或者 [ 12, 4 ]

限制:

  • 1 <= price.length <= 10^5
  • 1 <= price[i] <= 10^6
  • 1 <= target <= 2*10^6

解题思路:
采用双指针
定义双指针 leftright 分别位于数组的左右两端,循环执行(当指针相遇时,跳出):

  1. 计算sum = price[left] + price[right];
  2. 如果sum > target,则指针 right 向左移动,即执行 right--;
  3. 如果sum < target,则指针 left 向右移动,即执行 left++;
  4. 如果sum = target,则立即返回数组{ price[left],price[right] }

若循环结束,则返回空数组,代表无和为 target 的数字组合。
【剑指offer|图解|双指针】训练计划 I + 查找总价格为目标值的两个商品_第2张图片

c++代码:

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        int sz = price.size();

        int l = 0;//左指针
        int r = sz - 1;//右指针
        int sum = 0;
        while(l < r){
            sum = price[l] + price[r];
            if(sum > target) r--;
            else if(sum < target) l++;
            else return {price[l], price[r]};
        }

        return {};
    }
};

结尾

    今天的内容就到这里了,你们都学会了吗?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路。

你可能感兴趣的:(剑指offer每日一练,c++,经验分享,算法)