力扣刷题day1

数组基础知识整理

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

数组可以方便的通过下标索引的方式获取到下标下对应的数据。

需要两点注意的是

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的

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

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

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

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

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

--> 例子:

将main方法加载到栈内存中,执行int [ ][ ] arr = ,此时虽然采用静态初始化方法无new,依旧在堆内存中开辟一块空间,创建一个数组(3个连续的空间),数组的索引为0-2。针对此时的索引进行输出时得到的会是一个一维数组的地址值(即二维数组中“行”存放“列”的地址值)。此时创建3个一维数组,每个一维数组对应的索引为0-1。在这时的一维数组分别保存1-2,3-4,5-6。三个一维数组分别有三个内存地址值,此时二维数组存放的就是这3个内存地址值。

在二维数组通过3个地址值就可以找到3块空间,此时二维数组才算创建完毕,也会有一个对应的地址值(图上的0x0011),并把这个地址值赋值给arr。

参考资料:

代码随想录

https://www.jianshu.com/p/2eea7f9033c9

704 二分搜索

思路参考:代码随想录

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

            return -1;
    }
}

27 移除数组

思路参考:代码随想录

注意:时间复杂度为O(1),且最后输出的并不是所有的数组

方法:快慢指针 - 

如果快指针遇到的数不等于val;那么将快指针的那个数替换给慢指针所在的位置;慢指针向后移一位(刚开始的时候,快慢指针在相同位置也是需要原位替换的)

运用原理:数组的地址块是连续的,删除只能覆盖;删除一个之后,后面的位置全部都需要往前移动

class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 0;
        int slow = 0;

        while(fast < nums.length){
            if(nums[fast] != val){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }

        return slow;

    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值