#数组、#二分法、#双指针(快慢指针、左右指针)、#Stack
-
一、今日学习链接
-
视频链接:1、L704. Binary Search
-
二、 数组理论基础(摘自上述文章链接)
-
数组在内存中的存储方式:数组是存放在连续内存空间上的相同类型数据的集合。
-
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
-
数组下标都是从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,容易思绪混乱。