代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

数组内容复习

  1. 定义格式:数据类型[] 变量名 int[] arr
    数据类型 变量名[] int arr[]

数组是存放在连续内存空间上的相同类型数据的集合

  • 数组的下标是从零开始的
  • 数组的内存空间地址是连续的
  • 数组的元素不可以删除,只能覆盖
  1. 动态初始化:数据类型[] 变量名 = new 数据类型[数组长度];
    Int[] arr = new int[3]; new:为数组申请内存空间
    静态初始化:初始化时指定每个数组元素的初始值,有系统决定组长度
    格式:数据类型[] 变量名={数据1,数据2,数据3…} Int[] arr={1,2,3,,,}
    数组初始化时,会为存储空间添加默认值0/0.00/null

  2. 数组元素访问:

    变量访问方式:数组名[索引]

    索引的特征:从0开始;连续;每次加1

  3. 内存分配:内存地址 数据

    栈内存:存储局部变量 局部变量:定义在方法中的变量arr,使用完就会消失

    堆内存:存储new出来的内容(实体、对象)

  4. 常见问题:数组越界;空指针异常

  5. 数组常见操作:获取最值:①定义一个变量用于保存最值;②取数组中第一个数据作为变量的初始值;③与数组中剩余的数据逐个比对;④打印结果

704. 二分查找

704.二分查找-letcode

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

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
  1. 二分查找原理:
    • 设置查找区间:low = 0;high= arr.length-1;
    • 若查找区间[low, high]不存在,则查找失败;否则转下一步骤
    • 取中间位mid = (low + high) / 2;比较 target 与 arr[mid],有以下三种情况:
      ①若 target < arr[mid],则high = mid - 1;查找在左半区间进行,转步骤2;
      ②若 target > arr[mid],则low = mid + 1;查找在右半区间进行,转步骤2;
      ③若 target = arr[mid],则查找成功,返回 mid 值;
public int BinarySearch(int[] numbers,int target){
		int low=0;
		int height=numbers.length-1;
    int index=0;
    while(low<=height){
		    int mid=(low+height)/2;
        if(numbers[mid]==target){
		        return mid;
        }else if(numbers[mid]>target){
            height=mid-1;
        }else if(numbers[mid]<target){
            low=mid+1;
        }
    }
    return -1;
  }

27. 移除元素

27.移除元素-letcode

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

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 
或 nums = [2,2,0,0],也会被视作正确答案。
  1. 双指针法

    通过一个快指针(fast)和慢指针(slow)在一个for循环下完成两个for循环的工作

public int RemoveElement(int[] arr,int val){
    int slow=0;
    for(int fast=0;fast<arr.length;fast++){
      if(arr[fast]!=val){
          arr[slow]=arr[fast];
          slow++;
      }
    }
    return slow;
}

DAY1总结:

  1. 数组不可以删除,只能覆盖,所以对于数组中移除某元素可以利用双指针,快慢指针一起出发,当遇到目标值快指针向前走,将快指针遍历的值赋值给慢指针,最后返回慢指针。
  2. 二分查找主要是判断中间值(mid)和目标值进行判断,逐渐缩小目标区域。
  3. 对于数组的处理要切记索引从0开始,删除数据善用双指针。

今天的题目之前都做过,但是之前总是会参考别人的代码,形成的都是瞬时记忆,再次来做还是会忘记很多细节,希望之后可以独立思考,提高训练的效率,而不是一遍又一遍的忘记,未来可期,继续加油!菜鸟逐步努力当中……

你可能感兴趣的:(算法,数据结构,java)