• [leetcode] First Missing Positive


    Given an unsorted integer array, find the first missing positive integer.

    For example,
    Given[1,2,0]return3,
    and[3,4,-1,1]return2.

    Your algorithm should run in O(n) time and uses constant space.

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

    思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)

    public class Solution {
    	public int firstMissingPositive(int[] A) {
    		if (A == null && A.length == 0)
    			return 1;
    		int n = A.length;
    		int i;
    		for (i = 0; i < n; i++) {
    			while (A[i] > 0 && A[i] != i + 1 && A[i] <= n
    					&& A[i] != A[A[i] - 1]) {
    				swap(A, i, A[i] - 1);
    			}
    
    		}
    		for (i = 0; i < n; i++)
    			if (A[i] != i + 1)
    				return i + 1;
    
    		return n + 1;
    
    	}
    
    	private void swap(int[] a, int i, int j) {
    		int tmp = a[i];
    		a[i] = a[j];
    		a[j] = tmp;
    
    	}
    
    	public static void main(String[] args) {
    		 System.out.println(new Solution().firstMissingPositive(new int[] { 1,
    		 2, 0 }));
    		 System.out.println(new Solution().firstMissingPositive(new int[] { 3,
    		 4, -1, 1 }));
    		 System.out
    		 .println(new Solution().firstMissingPositive(new int[] { 0 }));
    		 System.out
    		 .println(new Solution().firstMissingPositive(new int[] { 1 }));
    		 System.out
    		 .println(new Solution().firstMissingPositive(new int[] { 2 }));
    		
    		 System.out.println(new Solution()
    		 .firstMissingPositive(new int[] { 0, 1 }));
    		System.out.println(new Solution()
    				.firstMissingPositive(new int[] { 1, 1 }));
    	}
    
    }

    第二遍记录:

      注意有重复元素的情况

      注意都是合法正数情况下,返回n+1

    public class Solution {
        public int firstMissingPositive(int[] A) {
            if(A==null||A.length==0)
                return 1;
            int n = A.length;
            for(int i=0;i<n;i++){
                while(A[i]>0&&A[i]<=n&&A[i]!=i+1&&A[i]!=A[A[i]-1]){
                    swap(A,i,A[i]-1);
                }
            }
            for(int i=0;i<n;i++){
                if(A[i]!=i+1)
                    return i+1;
            }
            
            return n+1;
            
        }
        private void swap(int[]a, int i,int j){
            int tmp= a[i];
            a[i]=a[j];
            a[j]=tmp;
        }
        
    }

    第三遍:注意交换的while循环。 

  • 相关阅读:
    线程和进程
    Java多线程实现(四种方法)
    Java中的锁
    synchronized和java.util.concurrent.locks.Lock
    Lock的实现类ReentrantLock&Condition类的await/signal/signalAll(生产者消费者场景)
    synchronized&Object类的wait/notify/notifyAll(生产者消费者场景)
    SQL语句优化
    面试
    数据库三大范式
    设计模式之JDK动态代理源码分析
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3810750.html
Copyright © 2020-2023  润新知