力扣剑指Offer
Posted Barrymeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣剑指Offer相关的知识,希望对你有一定的参考价值。
1、数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
方法一:for循环 (超时) 时间复杂度O(n)
class Solution {
public:
double myPow(double x, int n) {
double res=1;
if(n==0)
return 1;
else if(n>0){
while(n--){
res=res*x;
}
}
else{
while(n!=0){
res=res/x;
n++;
}
}
return res;
}
};
方法二:快速幂+位运算
class Solution {
public:
double myPow(double x, int n) {
double res=1;
if(x==0)
return 0;
long a=n;
if(a<0){
a=-a;
x=1/x;
}
while(a>0){
if((a&1)==1) res*=x;
x*=x;
a>>=1;
}
return res;
}
};
注意
如果上述a定义为int型会报错 Integer-overflow
方法三:递归
class Solution {
public:
double myPow(double x, int n) {
if(n==0) return 1;
if(n==1) return x;
if(n==-1) return 1/x;
double h=myPow(x,n>>1);
return h*h*myPow(x,n&1);
}
};
2、最小的k个数(TopK)
输入整数数组 arr
,找出其中最小的 k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
方法一:快排(最快速)
时间复杂度为O(n)
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> a;
topK(arr,0,arr.size()-1,k);
for(int i=0;i<k;i++){
a.push_back(arr[i]);
}
return a;
}
void topK(vector<int>& arr, int low, int high, int k) {
if(low < high) {
int pos = partion(arr,low,high);
if (pos == k)
return;
else if (pos < k)
topK(arr,pos+1,high,k);
else
topK(arr,low,pos-1,k);
}
}
int partion(vector<int>& arr, int low, int high) {
int pivot = arr[low];
while(low<high) {
while(low<high && arr[high] >= pivot)
high--;
arr[low] = arr[high];
while(low<high && arr[low] <= pivot)
low++;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
};
方法二:数据范围有限时,直接计数排序
class Solution {
public:
int counter[10005];
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> a;
if(k==0||arr.size()==0)
return a;
for(int num : arr) {
counter[num]++;
}
for(int i=0; i<10005; i++) {
while(counter[i]--){
a.push_back(i);
k--;
if(!k)
break;
}
if(!k)
break;
}
return a;
}
};
以上是关于力扣剑指Offer的主要内容,如果未能解决你的问题,请参考以下文章