刷题d01

数组理论基础
● 思维不难,主要是考察对代码的掌控能力
● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合
● 数组可以通过下标索引获取到下标对应的数据
● 数组下标从0开始
● 因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址
● Java中的二维数组,每一行连续,头结点地址没有规则

704.二分查找
● 力扣题目链接
● 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

思路
● 二分查找逻辑,两种方式,左闭右闭或者左闭右开
● 时间复杂度O(n) 空间复杂度O(logn)
计算 mid 时 为什么不是 m = (i + j) / 2?
 另外提前说明一下,计算 mid 时,需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 left 和 right 太大,直接相加导致溢出的情况

分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节

左闭右闭代码:

int binarySearch(int[] nums, int target) {
    int left = 0; 
    int right = nums.length - 1; // 注意

    while(left <= right) {
        int mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
    }
    return -1;
}

1、为什么 while 循环的条件中是 <=,而不是 <

因为初始化 right 的赋值是 nums.length - 1,即最后一个元素的索引,而不是 nums.length

什么时候应该停止搜索呢?当然,找到了目标值的时候可以终止:

    if(nums[mid] == target)
        return mid; 

但如果没找到,就需要 while 循环终止,然后返回 -1。那 while 循环什么时候应该终止?搜索区间为空的时候应该终止,意味着你没得找了,就等于没找到嘛。

while(left <= right) 的终止条件是 left == right + 1,写成区间的形式就是 [right + 1, right],或者带个具体的数字进去 [3, 2],可见这时候区间为空,因为没有数字既大于等于 3 又小于等于 2 的吧。所以这时候 while 循环终止是正确的,直接返回 -1 即可。

while(left < right) 的终止条件是 left == right,写成区间的形式就是 [right, right],或者带个具体的数字进去 [2, 2]这时候区间非空,还有一个数 2,但此时 while 循环终止了。也就是说区间 [2, 2] 被漏掉了,索引 2 没有被搜索,如果这时候直接返回 -1 就是错误的。

左闭右开代码:

int left_bound(int[] nums, int target) {
    int left = 0;
    int right = nums.length; // 注意
    
    while (left < right) { // 注意
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid; 
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid; // 注意
        }
    }
    return -1;
}

1、为什么 while 中是 < 而不是 <=?

答:用相同的方法分析,因为 right = nums.length 而不是 nums.length - 1。因此每次循环的「搜索区间」是 [left, right) 左闭右开。

while(left < right) 终止的条件是 left == right,此时搜索区间 [left, left) 为空,所以可以正确终止。

27. 移除元素
● 力扣题目链接
● 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
● 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
● 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路


● 暴力解法,删除后移动元素
● 双指针法,一个指针遍历数组,如果遇到不等于tar,就更换元素

1.暴力解法,遍历遇到等于var的移动后面元素往前一位, size--,因为元素往前移了一位,外层需要i--
public int removeElement(int[] nums, int val) {
    int size=nums.length;
    for(int i=0;i<size;i++){
       int num=nums[i];
       if(num==val){
          int index=i;
          //元素往前挪动一位
          for(int j=index;j<size-1;j++){
             nums[j]=nums[j+1];
          }
          nums[--size]=0;
          i--;
          continue;

       }

    }
    return size;
}

2.双指针解法

    public int removeElement(int[] nums, int val) {

       int slow=0;

       for(int x:nums){

           if(x!=val){

               nums[slow++]=x;

           }

       }

       return slow;

}

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: scl3300-d01是一种示例模型,广泛应用于工程和科学领域中。这个示例模型的主要用途是进行数据采集和信号处理,可以用来测量和记录各种物理量和现象。 这个示例模型具有多种功能和特点。首先,它可以实时采集不同传感器的数据,包括温度、压力、湿度、速度等等。通过将这些数据传输到计算机或控制器上,我们可以对它们进行分析和处理,以获取有关物理系统的信息。 其次,scl3300-d01示例模型具有高精度和高稳定性。它内置了各种校准和校准技术,可以提供准确的测量结果。此外,它还具有优秀的抗干扰和抗干扰能力,可以在各种复杂的环境中工作。 另外,scl3300-d01还提供了友好的使用界面和灵活的配置选项。用户可以根据实际需求选择不同的参数和设置,以实现不同的实验目标。并且,它还支持与其他设备或系统的集成,以实现更复杂的数据分析和控制应用。 总的来说,scl3300-d01是一个功能强大的示例模型,可用于各种工程和科学应用。它可以帮助我们更好地了解和探索物理世界,提供准确而可靠的数据支持。无论是用于教育、研究还是工业应用,scl3300-d01都是一种非常有价值的工具。 ### 回答2: SCL3300-D01是一种示例机型,它属于某个特定产品系列的一款设备。这个机型的详细说明可能因为缺乏背景信息而无法得知,因此我将以一种假设情境来解答问题。 SCL3300-D01示例机型可能是一种新型的智能手机。作为一款高端产品,它可能具备许多先进的功能和特点。例如,它可能采用了最新的处理器和更大内存,以提供更快的速度和更高的性能。其操作系统可能是最新版本的Android或iOS,并且具备多项定制功能和智能化技术。该机型可能还内置了高分辨率的摄像头和图像处理算法,以提供卓越的拍摄体验和照片质量。此外,它可能还支持快速无线充电和高容量电池,以满足人们日常使用的长时间需求。 在外观方面,SCL3300-D01可能采用了金属与玻璃的组合材质,提供更好的手感和精致的外观设计。其显示屏可能拥有更高的分辨率和更低的屏幕边框,以提供更好的视觉体验。此外,该机型可能具备防水和防尘功能,以增加其耐用性和使用寿命。 在连接性方面,SCL3300-D01可能支持5G网络,以实现更快的下载和上传速度。同时,该机型可能还具备Wi-Fi和蓝牙功能,以便用户能够更便捷地与其他设备进行连接和共享数据。 总的来说,SCL3300-D01示例机型可能是一款功能强大、外观精致的智能手机,满足用户的多方面需求。尽管以上信息仅为假设,但它反映了当今智能手机市场上许多高端产品的通用特点和趋势。 ### 回答3: SCL3300-D01是一种示例,它是指一个特定的产品或场景示例。无论是在哪种情况下,这个示例可能代表某种解决方案、产品、模型或策略。 具体而言,SCL3300-D01是一个产品示例的名称。它可能是指一款特定型号的电子设备、仪器或机器,用于特定的用途。它的功能可能包括数据收集、处理、分析、存储等。此外,它可能具有某种通信功能,允许与其他设备或网络进行数据交换。 除了产品示例之外,SCL3300-D01也可能是指一种解决方案或模型示例。例如,在某个行业或领域中,SCL3300-D01可能代表一种特定的创新技术或方法,用于解决特定的问题。这个示例可能包括了具体的步骤、流程、工具或策略,可以被其他人或公司用作参考或借鉴。 无论SCL3300-D01是指产品、解决方案还是其他类型的示例,重要的是要理解它所代表的特点和用途。这样,我们可以更好地理解和应用它,或者从中获得灵感和启示。同时,我们也可以根据这个示例进行修改、定制或创新,以满足自己的需求和目标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值