• 剑指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;
        }
    };
    
  • 相关阅读:
    SXOI2016 部分解题报告
    两道FFT的应用题
    [CQOI2012]交换棋子【网络流】【费用流】
    JAVA-SDK-Excel4j使用遇见的问题
    解决Zookeeper出现Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain问题
    maven项目打包时jar中不包含依赖
    CentOS_7中的zookeeper安装
    SpringBoot集成Redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误
    主机访问虚拟机中Redis
    使用SpringS声明式的开启事务
  • 原文地址:https://www.cnblogs.com/keepyang/p/12492950.html
Copyright © 2020-2023  润新知