首页 > 其他分享 >代码随想录-数组部分

代码随想录-数组部分

时间:2023-03-11 23:34:43浏览次数:54  
标签:val nums int 代码 元素 随想录 mid 数组

一.二分查找

力扣题目链接

给定一个 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]之间。

二分查找代码模板

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

思路就是分而治之,每次将问题规模缩小为原来的一半,时间复杂度为log n

LeetCode代码

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

二.移除元素

力扣题目链接(opens new window)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

思路

这里一开始的思路的使用快排的双指针,设置i指向队头和j指向队尾,如果a[i] = val 并且a[j] !=  val,就交换两个的值,这样就做到了把所有的val放到了后面,但是在处理边界的时候出现了问题,没有写出正确的代码

第二种思路,是双指针都指向队头,并且进行重复赋值,a[i] = a[j],如果当前检测到的不是val,就正常赋值,如果是val,就跳过,这里的方法非常巧妙,这里借鉴一下carl哥的图片

这样的核心代码就是

for(int j = 0;j < len;j++)
{
   if(a[j] != val)
   {
      a[i++] = a[j];    
    }        
}

LeetCode代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int j = 0;
        for(int i = 0;i < nums.size();i++)
        {
            if (nums[i] != val)
            {
                nums[j++] = nums[i];
            }
        }
     //最后返回去除了val的数组的长度 return j; } };

 

三.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 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]

思路

由于计算的是平方,所以我们无法确定处最小值,但是可以先确定出最大值,这里最大值肯定是从第一个数的平方和最后一个数的平方中选出,我们可以先找出最大值,然后从小到大存放结果,将最大值放到数组最后,然后依次寻找数组剩余中的最大值

这里因为要比较的是后面的元素平方和前面的元素平方,所以也用到了双指针

还是借用一下carl哥的图片,解释的非常直观

 核心代码

int i = 0,j = len-1;
k = len - 1;
while (i < j)
{
  if (a[i]*a[i] < a[j]*a[j])
   {
       b[k--] = a[j] * a[j];
   }  
  else
  {
       b[k--] = a[i]*a[i];  
  }            
}

LeetCode代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k = nums.size() - 1;
        vector<int> res(nums.size(),0);
        int i = 0,j = nums.size() - 1;
        while (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;
    }
};

 

标签:val,nums,int,代码,元素,随想录,mid,数组
From: https://www.cnblogs.com/polang19/p/17207344.html

相关文章

  • 代码随想录训练营day10|第18题. 四数之和、344.反转字符串、541. 反转字符串II、哈希
    第18题.四数之和题目链接:第18题.四数之和题目描述:给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c和d,使得a+b+c+d......
  • 低代码适用场景
    应用开发场景可以分成以下类型:1.业务流程应用使用低代码平台,企业可以创建员工真正喜欢的现代的、精美的业务应用。包括ERP系统、OA系统、CRM系统、WMS系统……几乎涵盖了......
  • 代码随想录day 6|指针总结
    环形链表题目链接:142、环形链表Ⅱ题目描述:给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,使用整数pos来表示链表尾连......
  • 顺时针打印二维数组
    我的代码思路:用循环模拟,碰壁之后转弯#include<stdio.h>#include<stdlib.h>intmain(){intn;scanf("%d",&n);int**a=(int**)malloc(n*sizeof(int*))......
  • 从代码层面来讲,何时使用设计模式
    1工厂模式想通过名称获取对象2抽象工厂模式单个工厂不满足对象的生产3单例模式全局只有一个对象4建造者模式通过构造函数创建对象不方便,例如,构造函数参数太多5原型模式......
  • 双指针技巧数组题目
    题目难度要点删除有序数组中的重复项●快指针与慢指针值不同,那么应该将值放在慢指针下一位移除元素●快指针对应值若不需移除,那么应该将值放在当前慢指针......
  • 量子图形加密算法的MATLAB代码实现
    一、概述目前主流的量子图形加密算法有量子像素编码算法(QuantumImagePixelEncoding,QIPE)、量子像素置乱算法(QuantumImagePixelScrambling,QIPS)等。一个简......
  • 代码随想录11天逆波兰表达式求值
    150. 逆波兰表达式求值给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算......
  • HTML 示例代码
    <html><head><title>邮件</title><linkrel="stylesheet"href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">......
  • 2023-03-11 Java中的动态数组
    类似C++中的vector,动态数组需要满足以下功能增(insert)删(remove)改(set)查(get和contain)支持泛型自动扩容和缩容上面的实现实际相当于JDK标准库中的java.util......