• First Missing Positive && missing number


    https://leetcode.com/problems/first-missing-positive/

    我原以为数组中不会有重复的数字,所以利用min、max分别记录给定数组中出现的最小正整数和最大正整数{可以求出这之间的所有数值之和sum2=(min+max)*(max-min+1)/2},并且遍历给定数组,将所有正整数求和计入sum1。如果sum1>sum2则,sum1-sum2为中断数字,否则说明【min,max】连续,max+1即为所求。接着处理一些边界条件接好。但,太天真了(不过这种思路对于不含重复元素的数组仍然还是不错的思路),看看这种思路的代码实现:

    class Solution {
    public:
        Solution():res(1){
        }
        int firstMissingPositive(vector<int>& nums) {
            if(nums.size()==0)
                return res;
            int min=0,max=0;
            int sum=0;
            for(int i=0;i<nums.size();i++)
                if(nums[i]>0){
                    min=max=nums[i];
                    break;
                }
            for(int i=0;i<nums.size();i++){
                if(nums[i]>0){
                    if(nums[i]<min)
                        min=nums[i];
                    if(nums[i]>max)
                        max=nums[i];
                    sum+=nums[i];
                }
            }
            res=(max-min+1)*(min+max)/2-sum;
            if(res==0)//说明数字连续,没有中断,缺失最后一个未出来的正整数
                res=max+1;
            if(min!=1)
                res=1;
            return res;
        }
    private:
        int res;
    };
    View Code

    依旧看看大神的想法:

    http://www.cnblogs.com/AnnieKim/archive/2013/04/21/3034631.html

     只要数组中有1这个元素,那么就会挤走数组中的第一个元素!如果有重复元素的话?(只会交换一次,后面的进行判定并忽略)

    class Solution {
    public:
        int firstMissingPositive(vector<int>& nums) {
            int i=0;
            while(i<nums.size()){
                if(nums[i]!=i+1 && nums[nums[i]-1]!=nums[i] && nums[i]>=1 && nums[i]<=nums.size())
                    swap(nums[i],nums[nums[i]-1]);
                else
                    i++;
            }
            for(int i=0;i<nums.size();i++)
                if(nums[i]!=i+1)
                    return i+1;
            return nums.size()+1;
        }
    
    };

    ------------------------------------------------分界线-------------------------------------另一道题--------------------------------------------------

     https://leetcode.com/problems/missing-number/ 

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

    For example,
    Given nums = [0, 1, 3] return 2.

    自己最初的思路完全可以应用到这道题中来(3月11下午13:04  新增)

    class Solution {
    public:
        Solution():res(1){
        }
            int missingNumber(vector<int>& nums) {  
            if(nums.size()==0)
                return res;
            int min=0,max=0;
            int sum=0;
            for(int i=0;i<nums.size();i++)
                if(nums[i]>=0){
                    min=max=nums[i];
                    break;
                }
            for(int i=0;i<nums.size();i++){
                if(nums[i]>=0){
                    if(nums[i]<min)
                        min=nums[i];
                    if(nums[i]>max)
                        max=nums[i];
                    sum+=nums[i];
                }
            }
            res=(max-min+1)*(min+max)/2-sum;
            if(res==0)//说明数字连续,没有中断,缺失最后一个未出来的正整数
                res=max+1;
            if(min!=0)
                res=0;
            return res;
        }
    private:
        int res;
    };
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    Elasticsearch 缓存总结
    ElasticSearch-集群
    HTTP协议详解
    HTTPS总结
    ElasticSearch--Document
    正排索引和倒排索引
    线上OOM排查步骤总结
    线程池-四种拒绝策略总结
    netty篇-练手
    netty篇-UDP广播
  • 原文地址:https://www.cnblogs.com/chess/p/5264912.html
Copyright © 2020-2023  润新知