H公司面试准备

最长上升子序列问题(LIS, LeetCode 300)

class Solution {
public:
    // O(N^2) Solution.
    int lengthOfLIS1(vector<int>& nums) {
        int dp[nums.size()+1], res=0;
        for(int i=0;i<nums.size();i++) {
            if(i==0) dp[i]=1;
            else {
                dp[i]=1;
                for(int j=0;j<i;j++) {
                    if(nums[i]>nums[j]) dp[i]=max(dp[i], dp[j]+1);
                }
            }
            res=max(res, dp[i]);
        }
        return res;
    }

    // O(N^log(N)) Solution.
    int lengthOfLIS2(vector<int>& nums) {
        int dp[nums.size()+1], len=0, mid, l, r;
        for(int i=0;i<nums.size();i++) {
            if(i==0) {
                dp[++len]=nums[i];
                continue;
            }
            if(nums[i]>dp[len]) dp[++len]=nums[i];
            else {
                l=1, r=len;
                while(l<r) {
                    mid=(l+r)/2;
                    if(dp[mid]<nums[i]) l=mid+1;
                    else r=mid;
                }
                dp[l]=nums[i];
            }
        }
        return len;
    }
};

N皇后问题(LeetCode 52)

class Solution {
public:
    int total=0;
    bool is_ok(int row, int* c) {
        for(int j=0;j<row;j++) {
            if(c[row]==c[j] || abs(j-row)==abs(c[j]-c[row])) return false;
        }
        return true;
    }
    void queen(int row, int n, int* c) {
        if(row == n) total++;
        else {
            for(int i=0;i<n;i++) {
                c[row]=i;
                if(is_ok(row, c)) queen(row+1, n, c);
            }
        }
    }
    int totalNQueens(int n) {
        int* c=new int[n];
        queen(0, n, c);
        return total;
    }
};

找到序列中的局部最大值(LeetCode 162)

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        if(nums.size()==1) return 0; 
        int l=0, r=nums.size()-1, mid;
        while(l<=r) {
            if(nums[l]>=nums[l+1]) return l;
            if(nums[r]>=nums[r-1]) return r;
            mid=(l+r)/2;
            if(nums[mid]>nums[mid-1]) l=mid;
            else if(nums[mid]<nums[mid-1]) r=mid;
        }
        return l;
    }
};

大数求根

class Solution {
public:
    int mySqrt(int x) {
        int l=1, r=x, mid;
        while(l<=r) {
            mid=(l+r)/2;
            if(mid==x/mid) return mid;
            else if(mid<x/mid) l=mid+1;
            else r=mid-1;
        }
        return r;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值