第四十天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
一、658. 找到 K 个最接近的元素
给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。
整数 a 比整数 b 更接近 x 需要满足:
|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-k-closest-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//数组分为两个部分,左侧都小于x,右侧都大于x,mid - 1与mid + 1相互比较,哪一方更接近x,随后依次扩大取值范围,直至区间内包括k个元素
class Solution {
public:
vector<int> findClosestElements(vector<int>& nums, int k, int x) {
int l = 0, r = nums.size() - 1;
while (l <= r) {
int mid = l +(r - l) / 2;
if (x > nums[mid]) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
//int right = lower_bound(nums.begin(), nums.end(), x) - nums.begin();
int right = l;
int left = right - 1;
while (k--) {
if (left < 0) {//如若左侧截至
right++;
} else if (right >= nums.size()) {
left--;
} else if (x - nums[left] <= nums[right] - x) {//左侧的更接近x
left--;
} else {
right++;
}
return vector<int> (nums.begin() + left + 1, nums.begin() + right);
}
};
50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {//迭代
public:
double myPow(double x, int n) {//快速幂,利用二分的理念,将x的n次幂分治为x的2的k次幂,即将n根据其二进制数拆为2的幂级数
double ans = 1.0;//例如77 = 1001101 在64、8、4、1上分别做了贡献,则需要将其计入答案
double res = x;
long long N = n;
if (n < 0) {
N = -(long long)n;//这里一定要注意啊。万恶的-2147483648
} else {
N = n;
}
while (N > 0) {
if (N % 2 == 1) {//当前n的最低位为1,即此位有贡献于n
ans *= res;//有贡献则计入答案
}
res *= res;//继续平方,
N /= 2;//舍去最低位,继续向前寻找贡献位
}
return n >= 0 ? ans : 1.0 / ans;
}
};
class Solution {//递归
public:
double Quick(double x, long long N) {
if (N == 0) {
return 1.0;//递归结束
}
double y = Quick(x, N / 2);
return (N % 2 == 0) ? y * y : y * y * x;//如果是偶数,平方,如果不是偶数则在乘上一个x
}
double myPow(double x, int n) {//快速幂,利用二分的理念,将x的n次幂分治为x的2的k次幂,即将n根据其二进制数拆为2的幂级数//递归
long long N = n;
return n > 0 ? Quick(x, N) : 1.0 / Quick(x, -N);
}
};