文章目录
- 1、深度学习
- 2、算法与数据结构
- 2.1、暴力解法
- 2.2、滑动窗口法
- 3、编程基础
1、深度学习
问题:CNN的本质和优势?
CNN 本质上是一个多层感知机 (MLP),其成功的原因关键在于它所采用的【稀疏连接】(局部感受)和【权值共享】的方式,一方面减少了的权值的数量使得网络易于优化,另一方面降低了过拟合的风险。
参考链接
2、算法与数据结构
题目链接
2.1、暴力解法
两个for循环,然后不断的寻找符合条件的子序列
c++
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= s) { // 一旦发现子序列和超过了s,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
python
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf')
for i in range(l):
cur_sum = 0
for j in range(i, l):
cur_sum += nums[j]
if cur_sum >= s:
min_len = min(min_len, j - i + 1)
break
return min_len if min_len != float('inf') else 0
2.2、滑动窗口法
滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
1、窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组
2、窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)
3、窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引)
c++
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0; // 滑动窗口数值之和
int i = 0; // 滑动窗口起始位置
int subLength = 0; // 滑动窗口的长度
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while (sum >= s) {
subLength = (j - i + 1); // 取子序列的长度
result = result < subLength ? result : subLength;
sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
python
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
left = 0
right = 0
min_len = float('inf')
cur_sum = 0 #当前的累加值
while right < l:
cur_sum += nums[right]
while cur_sum >= s: # 当前累加值大于目标值
min_len = min(min_len, right - left + 1)
cur_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
3、编程基础
问题:哪些情况不能用虚函数?
共有五种函数不能声明为虚函数,即普通函数(非成员函数)、构造函数、内联函数、静态函数、友元函数。
1)普通函数为啥不能是虚函数?
原因:
多态是依托于类的,要声明的多态的函数前提必须是虚函数。
2)构造函数为啥不能是虚函数?
原因:
多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不行。
3)内联函数为啥不能是虚函数?
原因:
内联函数属于静态联编,即内联函数是在编译期间直接展开,可以减少函数调用的花销,即是编译阶段就确定调用哪个函数了。
虚函数是为了实现多态,而多态是属于动态联编,即是在运行时才确定调用哪一个函数。显然这两个是冲突的。
4)静态函数为啥不能使虚函数?
原因:
静态函数的存在时为了让所有类共享。可以在对象产生之前执行一些操作。与虚函数的作用不是一路的
5)友元函数为啥不能是虚函数?
原因:
C++不支持友元函数的继承,不能继承的函数指定不是虚函数
参考链接