【剑指offer|图解|双指针】训练计划 I + 删除有序数组中的重复项

news2024/12/28 3:41:44

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:数据结构、算法模板
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📋前言
  • 一. ⛳️训练计划 I
  • 二. ⛳️查找总价格为目标值的两个商品
  • 三. ⛳️删除有序数组中的重复项
  • 📝结尾

📋前言

    💬 hello! 小伙伴们大家好哇,我们通过图文已经对顺序表进行了详细解析,相信小伙伴们已经对顺序表有的初步了解,今天我们在结合三道面试题对顺序表进一步巩固,如果有需要复习的小伙伴可以点击此处链接《图解顺序表》跳转过去对顺序表进行回顾。
    📚 系列专栏:本期文章收录在《剑指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 找到的奇数进行交换。

在这里插入图片描述

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 的数字组合。
在这里插入图片描述

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 {};
    }
};


三. ⛳️删除有序数组中的重复项

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

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

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

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

示例:

输入: nums = [ 1, 1, 2 ]
输出: 2, nums = [ 1, 2, _ ]
解释: 函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

限制:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

解题思路:
采用双指针
定义双指针 leftright 分别位于数组的下表为 0 和为 1 的位置,循环执行(当right走到数组末尾时停止):

  1. 如果nums[left] != nums[right],执行nums[++left] = nums[right++];
  2. 如果nums[left] == nums[right],执行right自增加1。

若循环结束,则返回right+1即可。
在这里插入图片描述

c语言代码:

int removeDuplicates(int* nums, int numsSize){
    //定义left指向数组下标为0的位置
    int left = 0;
    //定义right指向数组下标为1的位置
    int right = 1;

    //循环:当right指向数组末尾时停止
    while(right < numsSize)
    {
        if(nums[left] != nums[right])
        {
            //优化前
            // left++;
            // nums[left] = nums[right];
            // right++;

            //优化后
            nums[++left] = nums[right++];
        }
        else
        {
            right++;
        }
    }

    //返回结果
    return left+1;
}


📝结尾

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anaconda Powershell Prompt和Anaconda Prompt的区别

先说结论&#xff1a;主要功能应该一样。区别在于powershell支持的命令更多。比如查询路径的命令pwd和列表命令ls。 Anaconda PowerShell Prompt和Anaconda Prompt是Anaconda发行版中两个不同的命令提示符工具。 Anaconda Prompt是Anaconda发布的默认命令提示符工具&#xff0…

学c语言,从基础到深入,有相关书籍可以看吗?

学c语言&#xff0c;从基础到深入&#xff0c;有相关书籍可以看吗&#xff1f; 以下建议是结合本人工作20年的经历和感受总结出来的&#xff0c;每个人所处的环境和情况不太一样&#xff0c;仅供参考。 1. 首先建议你在学习C语言前要了解下这个语言的作用&#xff0c;使用场景…

pytorch基础语法问题

这里写目录标题 pytorch基础语法问题shapetorch.ones_like函数和torch.zeros_like函数y.backward(torch.ones_like(x), retain_graphTrue)torch.autograd.backward参数grad_tensors: z.backward(torch.ones_like(x))来个复杂例子z.backward(torch.Tensor([[1., 0]])更复杂例子实…

机器/深度学习模型最优化问题详解及优化算法汇总

前言 其实最优化问题&#xff0c;从小学开始学习数学的时候就可以说已经接触到了&#xff0c;在我印象中有个问题&#xff0c;用一个平底锅煎饼&#xff0c;每次只能放2只饼&#xff0c;煎一只饼要2分钟&#xff08;正反各用1分钟&#xff09;&#xff0c;煎三只饼要几分钟。这…

C语言C位出道心法(四):文件操作

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 一:C语言操作文件认知升维: 二:文件打开 三:文件读写操作 忙着去耍帅,后期补充完整.................................

力扣第1035题 不相交的线中等 c++ (最长公共子序列) 动态规划 附Java代码

题目 1035. 不相交的线 中等 相关标签 数组 动态规划 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足满足&#xff1a; nums1[i] nums2[j]…

双编码器构建机器人零力拖动/导纳控制思路

前言 这篇博客主要记录昨日与实验室大佬针对UR5机器人拖动示教功能实现的思路。由于本人并非主攻力控方面。直到昨天在做实验的时候&#xff0c;与力控组的大佬讨论过后才了解UR机器人实现导纳控制的思路。 关于导纳控制/零力拖动 导纳控制与阻抗控制单从字面去理解很容易记…

ROS中的节点与包

ROS中的节点与包 超声波传感器节点创建Package包 创建node节点运行node节点 安装的基本单位是包 一个包就是一组节点 超声波传感器节点 创建Package包 catkin_create_pkg ssr_pkg rospy roscpp std_msgs软件包回访 其实&#xff0c;在/opt/ros/noetic/share 里面都是软件包…

【沁恒蓝牙mesh】CH58x USB功能开发记录(0)

本文主要介绍基于【沁恒蓝牙mesh】CH58x USB功能&#xff0c;结合CH583m 评估板的软硬件为二次开发作一系列说明 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Etherne…

java多线程文件下载器

文章目录 1.简介2.文件下载的核心3.文件下载器的基础代码3.1 HttpURLConnection3.2 用户标识 4.下载信息4.1 计划任务4.2 ScheduledExecutorService&#x1f340; schedule方法&#x1f340; scheduleAtFixedRate方法&#x1f340; scheduleWithFixedDelay方法 5.线程池简介5.1…

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时…

Qt 自定义分页控件

目录 前言1、功能描述2、代码实现2.1 ui文件2.1 头文件2.2 源码文件2.3 设计思路 4、示例5、总结 前言 在应用程序开发时经常会遇到数据分页的需求&#xff0c;每一页展示特定数量的数据&#xff0c;通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件&a…

微服务-开篇-个人对微服务的理解

从吃饭说起 个人理解新事物的时候喜欢将天上飞的理念转换成平常生活中的实践&#xff0c;对比理解这些高大上的名词&#xff0c;才能让我们减少恐慌的同时加深理解。废话不多说&#xff0c;我们从吃饭开始说起&#xff0c;逐渐类比出微服务的思想。 &#xff08;个人见解&…

计蒜客详解合集(1)期

以后对于简单题目&#xff0c;大致6道题目出一期&#xff0c;稍有难度的才单独一期发布~ 目录 T1266——出勤记录 T1170——人民币支付 T1122——最长最短单词 T1115——字符串判等 T1116——验证子串 T1118——删除单词后缀 T1266——出勤记录 小蒜的算法课老师每次…

任正非说:段到段而不是端到端的变革,一定会局部优秀了,而全局灾难了。

你好&#xff01;这是华研荟【任正非说】系列的第34篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、执行一个良好的流程和建立一个良好的流程同样重要。业务部门的一把手要担负起建设和优化流程的责任&#xff0c;而不是流程…

NFS服务器的搭建

架设一台NFS服务器&#xff0c;并按照以下要求配置 准备阶段&#xff1a;准备两台虚拟机&#xff0c;一台作为服务端&#xff0c;一台作为客户端 服务端&#xff08;Server&#xff09;&#xff1a;192.168.75.139 客户端&#xff08;Client&#xff09;:192.168.75.160 两…

【Java 进阶篇】Java Filter 执行流程及生命周期详解

引言 在 Java Web 开发中&#xff0c;Filter 是一种强大的组件&#xff0c;它允许我们在请求到达 Servlet 之前或者响应返回给客户端之前执行一些操作。Filter 的应用场景非常广泛&#xff0c;例如日志记录、权限验证、字符编码转换等。本文将深入讨论 Java Filter 的执行流程…

element-Cascader级联选择器用法?

html <el-form-item label"行业选择" :label-width"formLabelWidth"><div class"m-4"><el-cascader v-model"form.tradeid" :options"options" :props"props" /></div></el-form-ite…

【仿真动画】人机协作机器人自动化产线仿真动画欣赏

人机协作机器人自动化产线仿真动画 动画部分思维导图 机器人自动化产线仿真动画是利用三维动画技术对机器人自动化产线进行仿真模拟&#xff0c;以直观、形象的方式展示产线的运行情况。它具有以下作用&#xff1a; 提高沟通效率 机器人自动化产线的设计、实施和维护涉及多个部…

19.9 Boost Asio 同步字典传输

这里所代指的字典是Python中的样子&#xff0c;本节内容我们将通过使用Boost中自带的Tokenizer分词器实现对特定字符串的切割功能&#xff0c;使用Boost Tokenizer&#xff0c;可以通过构建一个分隔符或正则表达式的实例来初始化tokenizer。然后&#xff0c;可以使用该实例对输…