首页 > 编程语言 >代码随想录算法day1-数组1

代码随想录算法day1-数组1

时间:2024-08-28 16:17:57浏览次数:6  
标签:index target nums int 随想录 rht day1 lft 算法

题目1 704. 二分查找

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

思路

这道题主要考察的是二分法,在使用二分法时要考虑好每次分割的左右边界,主要的分割方式有两种:1.左右边界全闭合([left, right]) 2.左闭右开([left, right).

代码

1.左右边界全闭合[left, right]

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int index = (nums.size() - 1) / 2;
        int lft = 0, rht = nums.size() - 1;
        while(lft <= rht)
        {
            if(nums[index] == target)
            {
                return index;
            }
            else if(nums[index] < target)
            {
                lft = index + 1;
                index = (lft + rht) / 2;
            }
            else
            {
                rht = index - 1;
                index = (lft + rht) / 2;
            }
        }
        return -1;
    }
};

2.左闭右开[left, right)

//[lft, rht)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int index = (nums.size() - 1) / 2;
        int lft = 0, rht = nums.size();
        while(lft < rht)
        {
            if(nums[index] == target)
            {
                return index;
            }
            else if(nums[index] < target)
            {
                lft = index + 1;
                index = (lft + rht) / 2;
            }
            else
            {
                rht = index;
                index = (lft + rht) / 2;
            }
        }
        return -1;
    }
};

题目2 27. 移除元素

题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

思路

这道题使用双指针法可以用一轮遍历完成指定元素的筛选与去除,双指针slow与fast分别进行非指定元素的复制与指定元素的筛选。

代码

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

题目3 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]

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

思路

这道题可以先平方然后直接调用sort来进行排序,但这种方法的时间复杂度是O(n+nlgn)=O(nlgn)。另一种方法是使用双指针的方法来排序,利用双指针遍历原始的数组加上赋值给新数组的遍历,时间复杂度为O(2*n)=O(n)。

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> results(nums.size());
        int lft = 0, rht = nums.size() - 1;
        int cur = results.size() - 1;
        while(lft < rht)
        {
            int l = nums[lft] * nums[lft];
            int r = nums[rht] * nums[rht];
            if(l <= r)
            {
                rht--;
                results[cur--] = r;
            }
            else if(l > r)
            {
                lft++;
                results[cur--] = l;
            }
        }
        results[cur] = nums[lft] * nums[lft];
        return std::move(results);
    }
};

标签:index,target,nums,int,随想录,rht,day1,lft,算法
From: https://www.cnblogs.com/code4log/p/18384158

相关文章

  • 浮点数算法的内部实现
     科学计算当中会用到不少浮点数的操作,这些浮点数可能是16位,32位,64位,80位甚至是128位。开源项目SoftFloat提供了一个高效的浮点运算实现,可以在没有硬件支持的情况下,高效模拟浮点数的各种操作。 那么,浮点数之间的比较,基本运算这些究竟是怎么实现的呢,可以拿32位浮点数作为例子。......
  • day13: 第六章 二叉树part01 |二叉树的前序遍历,后序遍历,中序遍历,(递归。层序(广度)跟
    二叉树递归三部曲:1.确定递归函数的参数和返回值。2.确定终止条件3.确定单层递归的逻辑144.二叉树的前序遍历:中左右,递归:classSolution{publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>res=newArrayList<Integer>();p......
  • 代码随想录算法训练营第一天 | 数组part01:数组理论基础,704. 二分查找,27. 移除元素 97
    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合数组徐璈注意的是:数组的下标都是从0开始的数组内存空间是的地址是连续的正因为舒适的内存空间是连续的,所以在删除和增添元素的时候,需要移动其他元素的地址。在c++中,vector的底层实现是array,严格来说,vector是容......
  • postman 发送json数据时,数据为随机数(雪花算法生成)
    要在Postman中发送由雪花算法计算出的随机数,您可以通过在预请求脚本中使用JavaScript代码来实现。首先,您需要添加一个script部分模拟雪花算法生成随机数的函数。可以在请求的"Pre-requestScript"选项卡中添加以下代码:functiongenerateRandomNumber(){constepoch=16094......
  • 使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能
    UsingstatisticalmethodstoreliablycomparealgorithmperformanceinlargegenerativeAImodelswithJAXProfileronAMDGPUs—ROCmBlogs摘要本文提供了一份详细的指南,介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAXProfiler和统计分析......
  • 《机器学习》—— K-means 聚类算法
    文章目录一、什么是K-means聚类算法?二、聚类效果评价方式——轮廓系数三、示例:代码实现四、聚类算法的优缺点一、什么是K-means聚类算法?K-Means是Python中非常流行的一个聚类算法,它属于无监督学习算法的一种。在scikit-learn(一个广泛使用的机器学习库)中,KMeans......
  • 亦菲喊你来学机器学习(14) --贝叶斯算法
    文章目录贝叶斯一、贝叶斯定理二、贝叶斯算法的核心概念三、贝叶斯算法的优点与局限优点:局限:四、构建模型训练模型测试模型总结贝叶斯贝叶斯算法(Bayesianalgorithm)是一种基于贝叶斯定理的机器学习方法,主要用于估计模型参数和进行概率推断。以下是对贝叶斯算法的......
  • 图论:配对问题与匈牙利算法
    文章目录引言配对问题一:网约车司机与乘客配对问题图模型配对模拟配对问题二:婚恋网站配对图模型配对模拟匈牙利(Hopcroft-Karp)算法模拟过程推演模拟编码实现核心概念优缺点应用场景结语引言配对问题是图论中的一个经典问题,通常涉及将一组对象(如人员、资源等)进行有......
  • c++算法3-广度优先搜索算法dfs
    搜索算法众所周知,搜索算法分为常见的两种深度优先搜索算法(dfs)广度优先搜索算法(bfs)深度优先搜索算法深度优先搜索算法就是一条道走到黑,如迷宫问题,重复不断地向前探索如果碰到死胡同就说明前面已经没有路了,这时候就可以想其他方向搜索,最终走到终点。回溯回溯是一种搜索算法......
  • 给自己复盘的随想录笔记-链表练习题(在整理ing)
    删除链表的倒数第N个节点双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。思路是这样的,但要注意一些细节。分为如下几步:推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑,定......