数组
定义:
数组是存放在连续内存空间上的相同类型数据的集合。
知识
- C++:int类型4字节float类型在32位中是4字节 在64位中是8字节
- Java的一维数组是连续的,二维数组在内存中不是连续地址空间
- 右移一维相当于除以2
- k–是最后减去k=1 i=k–;之后i=1,k=0
题目
二分法
前提是数组为有序数组,同时题目还强调数组中无重复元素,解决思路:两个边界,让左边界小于等于右边界通过比较mid与目标的值,来修改两个边界,直到找到目标值。
https://leetcode.cn/problems/binary-search/
Q:二分的边界应该如何判断?
优势1:因为取mid值时已经对比了和目标值的是否匹配,所以在之后确定边界时可以加一减一操作
1 | if (guess == target) { |
优势2:在while循环中设置一个小于等于,就可以在最后一次判断是否等于边界
例如{0,1,2,3,4}找4
right_index:0 left_index:4
right_index:3 left_index:4
right_index:4 left_index:4
Q:奇数和偶数数组有没有必要考虑?一个数的数组有没有必要考虑
其他方法需要,上述代码不用
双指针法
特点是通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。,主要问题就是两个指针的作用,一个用于寻找想要的值,一个用与确定目前索引
有两种实现一种是从两边开始,while保证left<=right;从一边开始 index<length
- 暴力解法时间复杂度:O(n^2)
- 双指针时间复杂度:O(n)
https://leetcode.cn/problems/remove-element/description/
https://leetcode.cn/problems/squares-of-a-sorted-array/
1 | public class Solution2 { |
滑动窗口
滑动窗口的思想就是两个指针前边指针用于确定窗口大小,后边指针用于缩小窗口以此为一个循环。循环到底是前指针指到最后。
也可以用于解决失败超时问题
- 暴力解法时间复杂度:O(n^2)
- 滑动窗口时间复杂度:O(n)
模拟
遵循循环不变量原则,这样就可以保证,每个边循环次数固定,比如如图所示每个边循环都是2 这样写起来就很简答。