CODE:
1.0达成某一目的的方法:
- 将原数组分割成新的数组
使用start,end来分割数组。并不需要复制产生新的数组。 - dp【0】【0】也可以使用递归公式来实现,但是需要使用到前面的值即dp【-1】【-1】,那么dp【0】【0】要使用dp【-1】【-1】。
当前数组可看为-1~n,只需要将数组扩充一个单位,然后将整个数组元素向后移动一个单位,此时dp【0】【0】即作为了dp【-1】【-1】。
当然假如这个dp【0】可以直接表示出来的话就没有必要那么麻烦去扩充数组了 - 判断元素是否在数组中存在(查找操作),同时数组中的元素还对应一个要使用或返回的相应值,此时可以用字典来存储数组元素。
- 多次顺序遍历数组:对一个数组遍历两 / n 次,可以通过变量的范围为0~2*vector.size()-1,然后让变量对整个数组长度取余,此时变量变化为多次从:0 到vector.size()-1,即实现多次顺序遍历数组。
- 路径的表示方法:(通过数组中每个值的选定情况来表示路径)
通过一个变量,二进制数的每一位对应数组的每一位的状态,0表示未选中,1表示选中。 - 取中间值(防止溢出):
int middle = left + ((right - left) / 2);
等同于(left + right)/2,防止溢出。
1.1、代码书写思路:注意越界情况
写代码是通过具体的含义来书写,
while 循环该如何书写
写代码其实是首先用语义来确定你具体要做什么,然后用精准的代码(变量、表达式…与语义精准对应)来表示出来。
- 首先将循环体大致写出来
- 然后再来完善while循环
- 首先分析在没有进入while循环时的初始状态,每个变量代表的确切含义,以及将它们整合起来的含义。
- 然后经过循环体后又变成了初始状态,循环往复
例题
code:
- [ i , j ]构成范围
- 范围总和小于目标值
- j出现越界,直接返回
- 没有越界,则加入下一个值
- 范围总和大于目标值
- 是否更新len
- 此时的范围:首元素向后移动一个单位
- 更新sum
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i, j = -1;
i = 0;
int sum = 0;
int len = INT_MAX;
while(i <= nums.size()-1 && j < int(nums.size())){
if(sum < target) {
if(++j == nums.size()) {
if(len == INT_MAX) return 0;
return len;
}
else sum += nums[j];
}
else {
if(len > j-i+1){
len = j-i+1;
}
sum-=nums[i++];
}
}
return len;
}
};
math:
- j - i:j 个值减掉 i 个值剩下 j - i 个值:可以想象有 j 个物品,将前 i 个物品扔掉(包括第 i 个)剩下几个物品。
-
- 例:4-1:四个值减掉一个值剩下三个值
- 除法是向下取整:当数据个数为偶数的时候,/2选择的是中间两个值中前一个值。