目录
1.x的平方根
69. x 的平方根 - 力扣(LeetCode)
https://leetcode.cn/problems/sqrtx/
cpp
class Solution {
public:
int mySqrt(int x) {
if (x == 0 || x == 1)
return x;
int left = 0, right = x;
int ans = 0;
while (left <= right)
{
int mid = left + (right - left) / 2;
if ((long long)mid * mid == x)
{
return mid;
}
else if ((long long)mid * mid < x)
{
ans = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return ans;
}
};
a.核心思想
使用二分查找法来确定非负整数x的算术平方根的整数部分。因为算术平方根的取值范围在0到x(当x大于1时,当x为0或1时平方根就是其本身),我们可以在这个范围内通过二分查找逐步缩小范围,直到找到最大的整数mid使得mid*mid <= x。
b.思路
① 处理特殊情况,当x为0或1时,直接返回x。
② 初始化二分查找的左右边界,left = 0,right = x。
③ 在左右边界范围内进行二分查找,计算中间值mid,比较mid*mid与x的大小关系:
如果mid*mid == x,直接返回mid。
如果mid*mid < x,说明mid可能是结果或者结果在mid右侧,先记录mid,然后左边界右移(left = mid + 1)。
如果mid*mid > x,说明结果在mid左侧,右边界左移(right = mid - 1)。
④ 最终返回记录的满足条件的最大整数。
c.步骤
① 特殊情况处理。
② 初始化左右边界。
③ 二分查找循环,根据mid*mid与x的关系调整边界。
④ 返回结果。
2.vector的扩容机制以及删除元素是否会释放内存
a.vector的扩容机制
① 触发时机: 当向
vector插入元素且当前容量不足时触发扩容。**② 扩容策略:**通常以当前容量的某个倍数(常见为 2 倍)增长,不同编译器实现可能略有差异。新容量确定后,会重新分配一块更大的连续内存空间,将原有元素拷贝到新空间,并释放旧空间。
b.vector删除元素是否会释放内存
① 一般情况: 使用如
erase等方法删除元素时,vector不会立即释放内存。它仍然保留原有的容量,以便后续可能继续插入元素,避免频繁扩容开销。② 释放 内存 方法: 若想释放多余内存,可使用"交换技巧",例如
vector<int>(v).swap(v);(C++98 及之前)或v.shrink_to_fit();(C++11 起),请求将容量缩减至与元素数量匹配。但这只是请求,编译器可能不执行。
希望这些内容对大家有所帮助!
感谢大家的三连支持!