代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

1 day

数组理论基础

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

数组下标都是从0开始的。

正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。(弊端)

数组的元素是不能删的,只能覆盖

那么二维数组在内存的空间地址是连续的么?

在C++中二维数组在地址空间上是连续的。

像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机,所以看不到每个元素的地址情况,做一个实验。

public static void test_arr() {
    int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}};
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
    System.out.println(arr[3]);
}

输出的地址为:

[I@7852e922
[I@4e25154f
[I@70dea4e
[I@5c647e05

这里的数值也是16进制,这不是真正的地址,而是经过处理过后的数值了,我们也可以看出,二维数组的每一行头结点的地址是没有规则的,更谈不上连续。

所以Java的二维数组可能是如下排列的方式:

894bc6ba9fb54cdeb3f90a5487c11672.png

 

 

收获

之前其实对二维数组一直有所疑惑,今天突然想到arr[0],arr[1]这样输出的是什么东西。直到问了彷徨,他的一句话讲明白了。“Java实际上没有多维数组,只有一维数组。多维数组被解释为‘数组的数组’ ”。也算是对上面这张图的深入理解把。

704.二分查找

目标:熟悉 根据 左闭右开左闭右闭 两种区间规则 写出来的二分法。

题目:

950cc0de146542838008fe8943c213ba.png

 

 

二分法主要的难点在于 while (left <= right) ,何时是 <=,何时是 <。其次是 if (nums[middle] > target) right 何时赋值为 middle - 1,何时赋值为 middle。

而如何判断就在于对不变量(就是区间)的选择与理解。

收获

length 和 size()的区别

length 是属性,size()是方法

  1. length :表示的是数组的长度 数组

  2. length():表示的是字符串的长度 字符串

  3. size():表示的是集合中有多少个元素 集合

分清描述的“对象”是什么就行

 

= 是赋值 ,==才是判断是否相等(返回的是布尔值)

27.移除元素

双指针法 是本题的精髓

题目:

e1b3ac8ae5a346aeab3ce17bcc46b30a.png

 

收获

通过本题我最大的收获就是提高了 debug 的能力,因为本题的暴力解法我用到了大量的 for 循环,但是一直在出错找不到出错的原因,就只能用 idea 的 debug 来一步步进入 for 循环来看问题出现在了哪里。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值