二分查找,伪代码见下
function findMinGreenIndex(array, len, target)
l = -1, r = len
while l + 1 < r
mid = (l + r) / 2
if isGreen(array, mid, target)
r = mid
else
l = mid
return r
function isGreen(array, mid, target)
return array[mid] >= target
线性枚举特点:暴力算法、简单有效、用于开拓思路
求最大值的代码:
function getMax(n,a)
max = -inf;
for i -> (0, n-1)
if a[i] >max
max = a[i]
return max
线性枚举,对应力扣,有序数组中的单一元素,代码见下
cpp
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
for(int i=1; i<nums.size()-1; ++i){
if(nums[i] != nums[i-1] && nums[i] != nums[i+1]){
return nums[i];
}
}
if(nums.size() == 1){
return nums[0];
}
if(nums[0] != nums[1]){
return nums[0];
}
return nums.back();
}
};
模拟(概念):模拟算法其实是根据题目做,题目要求什么,就去做什么,有以下关键点:
第一点:数据结构,对于模拟题而言,最关键的其实是数据结构,看到一个问题,选择合适的数据结构,然后根据问题实现对应的功能。模拟题常见的数据结构是:数组、字符串、矩阵、二叉树、链表等等
第二点:算法技巧,模拟时一般会用到一些算法技巧,或者说混合算法,比如排序,递归,迭代等等
模拟题一:对应力扣,交换数字,代码见下
cpp
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
a[0] = a[0] ^ a[1];
a[1] = a[0] ^ a[1];
a[0] = a[0] ^ a[1];
return a;
}
};
模拟题二:对应力扣,位1的个数,代码见下
cpp
class Solution {
public:
int hammingWeight(uint32_t n) {
int sum = 0;
while(n){
sum += n & 1;
n = (n >> 1);
}
return sum;
}
};
递推:递推就是一个循环和迭代的过程。
递推例子:
1 斐波那契数列 F(0) = 0 F(1) = 1
F(n) = F(n-1) + F(n-2) ,其中n > 1,给定n(0<=n<=30),请计算F(n)
伪代码见下:
int fib(int n){
int i;
int F(31) = {0, 1};
for(i=2; i<=n; ++i){
F[i] = F[i-1] + F[i-2];
}
return F[n];
}
2 泰波那契序列
T(0) = 0; T(1) = 1; T(2) = 1
且在 n > 2的情况下,T(n) = T(n-1) + T(n-2) + T(n-3)
3 二维递推问题:如果一维解决不了问题的话,需要升维度处理。
代码练习 1 ,对应力扣 斐波那契数列,代码见下:
cpp
class Solution {
public:
int fib(int n) {
int f[31];
f[0] = 0;
f[1] = 1;
for(int i=2; i<=n; ++i){
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
};
代码练习2 ,对应力扣,杨辉三角 ||
cpp
class Solution {
public:
vector<int> getRow(int rowIndex) {
int f[2][34];
int now = 1;
int pre = 0;
f[pre][0] = 1;
for(int i=1; i<=rowIndex; ++i){
for(int j=0; j<=i; ++j){
if(j == 0 || j == i){
f[now][j] = 1;
}else{
f[now][j] = f[pre][j]+f[pre][j-1];
}
}
pre = 1 - pre;
now = 1 - now;
}
vector<int> res;
for(int j=0; j<=rowIndex; ++j){
res.push_back(f[pre][j]);
}
return res;
}
};