剑指offer

剑指OFFER

  • 找出数组中重复的数字

思路:设置n个坑,每次检查当前坑的数和当前的坑是否匹配,以及当前以当前坑上的数作为坑里面是否已经有当前坑的数(有点绕人!)
代码:

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int len = nums.size();
        for (auto x : nums)
            if (x < 0 || x >= len)
                return -1;
        for (int i = 0; i < len; i++) {
            while (i != nums[i] && nums[i] != nums[nums[i]]) {
                swap(nums[i],nums[nums[i]]);
            }
            if (nums[i] != i && nums[i] == nums[nums[i]])
                return nums[i];
        }
        return -1;
    }
};
  • 不修改数组找出重复的数字

思路一:开辟额外的数组 空间复杂度O(N)

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int len = nums.size();
        int arr[len];
        for (int i = 0; i < len; i++) {
            arr[i] = 0;
        }
        for (int i = 0; i < len; i++) {
            arr[nums[i]]++;
            if (arr[nums[i]] > 1) {
                return nums[i];
            }
        }
    }
};

思路二:抽屉原理+分治法 空间复杂度O(1);

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        //分治法 + 抽屉原理
        int l = 1, r = nums.size() - 1;
        while (l < r) {
            int mid = (l + r) >> 1;
            int cnt = 0;
            for (auto x : nums) 
                cnt += (x >= l && x <= mid);
            if (cnt > mid - l + 1) r = mid;
            else l =  mid + 1;
        }
        return r;
    }
};
  • 二维数组中的查找

O(m+n) 线性查找

代码:

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        int len = array.size();
        if (array.empty() || array[0].empty()) {
            return false;
        }
        int i = 0, j = len - 1;
        while (i < len && j >= 0) {
            if (array[i][j] == target) {
                return true;
            }
            if (target > array[i][j]) i++;
            else j--;
        }
        return false;
    }
};
  • 替换空格

简单的语法题

代码:

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        int len = array.size();
        if (array.empty() || array[0].empty()) {
            return false;
        }
        int i = 0, j = len - 1;
        while (i < len && j >= 0) {
            if (array[i][j] == target) {
                return true;
            }
            if (target > array[i][j]) i++;
            else j--;
        }
        return false;
    }
};
原文地址:https://www.cnblogs.com/Lysz1996/p/12492950.html