基本的知识以及注意点
数组实际上就是最简单的数据结构,其中最主要的思想就在于数组是存放在连续内存空间上的相同类型数据的集合。
需要两点注意的是
数组下标都是从0开始的。
数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
而且大家如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
数组的元素是不能删的,只能覆盖。
二分法
首先回顾一下经典的二分法(折半查找)
在这里我们先了解了什么是循环不变量,就是在循环的过程中对于区间的坚持不变,需要自己对于区间的坚持定义。
建议有所遗忘的读者可以回去看看复习一下。包括两种定义方式:【】和【)两者的应用都有其具体的用法,虽然大多数情况下二者可以相互转化,但是涉及到边界情况,就需要具体分析了,建议都了解一下思想。
双指针法
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
这道题可能需要注意的是,我们该怎么定义快指针和慢指针。思想还是很简单的。
滑动窗口
本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。
滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。
模拟行为
在这道题目中,我们再一次介绍到了循环不变量原则,其实这也是写程序中的重要原则。
相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实真正解决题目的代码都是简洁的,或者有原则性的,大家可以在这道题目中体会到这一点。