首页 > 其他分享 >day1 - 数组part01

day1 - 数组part01

时间:2023-09-06 23:55:39浏览次数:31  
标签:right cur nums part01 day1 int 数组 left target

力扣704. 二分查找

思路:假如有n个数,数组下标就是0到n-1,那么第一次从n/2开始找

如果这个数比目标数大,说明目标数在左边,于是从0到中间边界找。

如果这个数比目标数小,说明目标数在右边,于是从中间边界+1到n-1找。

为了明确中间边界是多少,举个例子:

 

假如数组是:0,1,3,5,6,7,8; target = 7;

数组大小是7,第一次从7/2=3开始查找,也就是从5开始,找到5后,发现7比5大, 那么要从5的下一位到末尾也就是下标6。也就是说如果找的数在右边就从下一位到末尾。

假如target=1呢,第一次还是从下标3开始找,也就是5开始,发现5比目标数1大,那么从0到5的上一位开始找。

 

上面是数组长度为奇数的情况那么如果长度为偶数呢?

比如数组是:0,1,3,5,6,7,8,9; target = 8

数组大小是8, 从4开始找,找到6,发现8比6大,于是从下一位到末尾查找。

由此可以发现,这和数组大小的奇偶性质没有关系。

于是可得逻辑

if (nums[cur] > target)
{
   right = cur - 1;
}
if (nums[cur] < target)
{
   left = cur + 1;
}

 

接下来写代码

class Solution {
public:
   int search(vector<int>& nums, int target) {
       //左下标
       int left = 0;
       //右下标
       int right = nums.size() - 1;
       //中间下标
       int cur;
       while(left < right)
      {
           cur = (left + right) / 2;
           if (nums[cur] == target)
          {
               return cur;
          }
           else if (nums[cur] > target)
          {
               right = cur - 1;
          }
           else
          {
               left = cur + 1;
          }
      }
       return -1;
  }
};

代码逻辑比较简单,提交!

image-20230906231244850

OH, No!

没有ac,提示用例是只有一个数的数组。

为什么没通过,思考一下如果只有两个数的数组0, 1,目标值是1

根据代码逻辑,开始值查找的是0,不是目标值,下一个left为1,此时right也是1,循环结束。

因此应该把while循环的条件改为小于等于

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

成功ac!

 

此题除了改动while循环条件,也可以一开始就将right设置为nums.size(),这样相当于用于比真实的下标大1,此时while循环条件就可以填小于。

因此第一种解法,称之为左闭右闭区间,第二种解法称之为左闭右开区间!

 

力扣27. 移除元素

思路:快慢指针,一个快指针负责遍历数组,如果找到数值不是val的数,那么把数值赋值给慢指针,然后慢指针移动到下一位。

其实这个思路就是一个萝卜一个坑,快指针负责出去找萝卜,慢指针在家里等着,有萝卜了就把萝卜放进去,然后去下一个坑等着

代码实现:

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];
               j++;
          }
      }
       return j;
  }
};
总结

明天面试,这两个等有时间刷。35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 。代码随想录已经粗略刷过一遍了,这次要深入的刷,尽量把所有解法已经其原理搞懂。

标签:right,cur,nums,part01,day1,int,数组,left,target
From: https://www.cnblogs.com/xiaowangshu1/p/17683730.html

相关文章

  • python-day1
    1.print向文件输出内容A=open('D:/practice.text','a+')print('helloword',file=A)A.close()2.转义字符print('hello\nword')#newlineprint('hello\rword')#return光标移动到本行开头print('hello\bword')#backspaceprint......
  • 使用JavaScript计算两点经纬度之间的弧线点经纬度数组
    前言地球是一个近似于椭球体的三维物体,因此在计算两个经纬度点之间的距离时,不能简单地将其视为平面上的直线距离。相反,我们需要考虑地球的曲率,并使用球面三角法来计算两点之间的弧线距离及其中的插值点。通过本篇博客,我们将使用JavaScript来实现根据两个经纬度点返回两点之间的弧......
  • 【Leetcode刷题记录】1、统计参与通信的服务器;2、统计二叉树中好节点的数目;3、从两个
    1、统计参与通信的服务器题目:这里有一幅服务器分布图,服务器的位置标识在 m*n 的整数矩阵网格 grid 中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。请你统计并返回能够与至少一台其他服务器进行通信的服务器的......
  • 数组转树
    constlist=[{id:1,name:'部门1',pid:0},{id:2,name:'部门1-1',pid:1},{id:3,name:'部门1-2',pid:1},{id:4,name:'部门1-1-1',pid:2},{id:5,name:'部门1-2-1',pid:3},{id:6,name:&#......
  • 【C语言进阶】指针数组 —— 数组指针
    (文章目录)......
  • SpringBoot启动报数组下标越界
    问题描述:启动读取配置文件时报错关键字:ERRORorg.springframework.boot.SpringApplication-Applicationrunfailedjava.lang.ArrayIndexOutOfBoundsException:-1ConnectedtothetargetVM,address:'127.0.0.1:58753',transport:'socket'2023-09-0611:09......
  • java中String和数组的长度
    数组的长度是lengthString的长度是length()在Java中,数组是引用数据类型,不是类,因此也是读取固有的length属性得到数组长度,它没有length()方法。但是,java中的String类型是jdk中已经封装好的final类,类就有属性和方法,只是String没有length属性,只有length()方法。......
  • 剑指 Offer 42. 连续子数组的最大和
    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。classSolution{publicintmaxSubArray(int[]nums){......
  • C语言数组(12)——写一个三子棋游戏(3)
    一.回顾我们上篇文章主要介绍了棋盘的打印,我们用到了DisplayBoard()函数,那么我们现在就需要来实现玩家下棋这一操作二.玩家下棋功能的实现与前几个函数一样我们将玩家下棋功能代码封装成一个函数,命名为PlayerMove()函数,我们前面说过玩家下棋的本质就是将数据填进二维数组中的元素中......
  • 在 PHP 数组中的两个字符串之间切换
    在PHP中,你可以使用array_flip()函数和条件语句来在数组中的两个字符串之间进行切换。以下是一个示例://创建一个数组,包含两个字符串的映射关系$mapping=array('string1'=>'value1','string2'=>'value2');//定义当前需要切换的字符串$currentString='string......