代码随想录算法训练营第一天 | 704. Binary Search、27. Remove Elements.

#数组、#二分法、#双指针(快慢指针、左右指针)、#Stack

  • 一、今日学习链接

  • 二、 数组理论基础(摘自上述文章链接)

    • 数组在内存中的存储方式:数组是存放在连续内存空间上的相同类型数据的集合。

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

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

    • 数组元素不能被删除, 只能被覆盖。

  • 三、解题思路

  • 题号思路算法难度
    704. Binary Search

    关键词:ascending order, target, index, -1, O(logn), unique

    如果不考虑时间复杂度,此题可用O(n)解法,即遍历整个数组寻找target。O(logn)解法:二分查找。

    二分法easy
    35. Search Insert Position

    关键词:distinct, ascending order, target, index, O(logn)

    如果没有target,return left;

    二分法easy
    34. Find First and Last Position of Element in Sorted Array

    关键词:non-decreasing order, target, [-1, -1], O(logn)

    三种情况:target在数组范围之外;在数组范围中,但不存在target;在数组范围中,且存在target。

    暴力解:O(n)复杂度

    O(logn)解:

    解法一:二分法分别处理以上三种情况,需要helper method

    解法二:二分法找到其中一个target后,指针左右移动查找左右边界,需要helper method

    解法三:使用boolean标记找到的target是否是第一次出现,需要helper method

    二分法medium
    69. Sqrt(x)

    关键词:non-negative(意味有0),truncate, 2^31 - 1

    long left = 0, right = x/2;

    return type is int,需要进行类型转换。

    二分法easy
    367. Valid Perfect Square

    关键词:positive, boolean, 2^31 - 1

    long left = 0, right = num/2;

    使用long避免溢出。

    二分法easy
    27. Remove Elements

    关键词:in-place,相对位置不变

    考察:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

    slow, fast同时出发,return slow;

    双指针(快慢指针法)easy
    26. Remove Duplicates from Sorted Array

    关键词:non-decreasing order, unique, relative order

    slow, fast同时出发,return slow+1;

    双指针(快慢指针法)easy
    283. Move Zeros

    关键词:relative order, in-place

    需要用到swap

    双指针(快慢指针法)easy
    844. Backspace String Compare

    关键词:String, boolean

    Time Complexity: O(M+N), where M, N are the length of s and t respectively.

    Stack:后进先出

    String判断是否相等:.equals

    转换成 String:String.valueOf()

    stack.pop()要在stack.size()>0时操作

    解题时,重复使用的函数,可以单数使用一个method以减少冗余。

    Stack

    easy
    977. Squares of a Sorted Array

    关键词:non-decreasing order, negative number included

    需要额外空间和一个指针记录re s位置

    双指针(左右指针法)easy
  • 四、总结(部分摘自上述文章链接)

  • 做题时长:over 4 hours,大部分题较为简单,除了L34。

  • 二分法:前提是数组已经排好序,且没有重复元素(一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的)。循环不变量规则([左闭,右闭] ,[左闭,右开))。

  • 双指针法(快慢指针法): 通过一个快指针和慢指针在一个循环下完成两个循环的工作。双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。

    • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
    • 慢指针:指向更新 新数组下标的位置

        快慢指针在做题时,最好固定一个case来思考,如果同时考虑多种case,容易思绪混乱。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值