剑指Offer_WEEK01

剑指 Offer 03. 数组中重复的数字

思路:将数组进行排序,这样数组是一个有序的序列,然后判断两个相邻的数是否相等,是则返回相同的数

时间复杂度:O(nlogn)

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int res = 0;
        for(int i = 0;i < nums.size();i++){
            if(nums[i] == nums[i + 1]){
                res = i;
                break;
            }
        }
        return nums[res];
    }
};

 

思路:

  1. 扫描整个数组
  2. 判断下标i是否等于v[i]
    1. 如果相等,则扫描下一个数
    2. 否则判断v[i]是否与v[v[i]]相等
      1. 如果相等,返回v[i]
      2. 如果不相等,就交换它们

 时间复杂度O(n),空间复杂度O(1)

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        int len = nums.size(),ans;
        for(int i = 0;i < len;i++){
            if(i == nums[i]){
                continue;
            }else{
                if(nums[i] == nums[nums[i]]){
                    ans = nums[i];
                    break;
                }else{
                    swap(nums[i],nums[nums[i]]);
                }
            }
        }
        return ans;
    }
};

剑指 Offer 04. 二维数组中的查找

暴力解法O(nm):

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if (matrix.size() == 0 || matrix[0].size() == 0){
             return false;
        }
        for(int i = 0;i < matrix.size();i++)
            for(int j = 0;j < matrix[0].size();j++){
                if(target == matrix[i][j])
                    return true;
            }
        return false;
    }
};

剑指 Offer 05. 替换空格

class Solution {
    public String replaceSpace(String s) {
        int len = s.length();
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < len;i++){
            if(s.charAt(i) == ' '){
                sb.append("%20");
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}

剑指 Offer 06. 从尾到头打印链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        vector<int> v,x;
        while(head){
            v.push_back(head->val);
            head = head->next;
        }
        for(int i = v.size() - 1;i >= 0;i--){
            x.push_back(v[i]);
        }
        return x;
    }
};

剑指 Offer 07. 重建二叉树

待补充

剑指 Offer 09. 用两个栈实现队列

待补充

剑指 Offer 10- I. 斐波那契数列

class Solution {
public:
int fib(int n){

    const int N = 1e9 + 7;

    int a = 0,b = 1,c;
    
    if(n == 0 || n == 1)
        return n;
    
    for(int i = 1;i < n;i++){
        c = (a + b) % N;
        a = b;
        b = c;
    }
    return c;
 } };

剑指 Offer 10- II. 青蛙跳台阶问题

class Solution {
public:

    const int N = 1e9 + 7;

    int numWays(int n) {
        int a = 1,b = 2,c;
        if(n == 0 || n == 1)
            return 1;
        if(n == 2)
            return 2;
        for(int i = 1;i < n - 1;i++){
            c = (a + b) % N;
            a = b;
            b = c;
        }
        return c;
    }
};

剑指 Offer 11. 旋转数组的最小数字

class Solution {
public:
    int minArray(vector<int>& numbers) {
        sort(numbers.begin(),numbers.end());
        return numbers[0];
    }
};

 剑指 Offer 12. 矩阵中的路径

 待补充

posted @ 2020-11-23 17:49  五岁就很帅🎈  阅读(111)  评论(0)    收藏  举报