力扣剑指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的主要内容,如果未能解决你的问题,请参考以下文章

力扣剑指Offer

力扣剑指offer(day1 链表)

力扣剑指offer(day1 链表)

力扣剑指offer(day1 链表)

剑指offer系列——剑指 Offer 65. 不用加减乘除做加法

力扣剑指off 56-I数组中数字出现次数