Arrays分类算法-First Duplicate Value

题目要求在这里插入图片描述

解法一:
暴力解法,找到数组中相同的两个数,然后返回index最小的那个(最早出现的那个)
Time: O(n^2) Space: O(1)
代码:

import java.util.*;

class Program {

  public int firstDuplicateValue(int[] array) {
    // Write your code here.
		if (array == null || array.length < 2) return -1;
		int index = Integer.MAX_VALUE;
    for (int i = 0; i < array.length - 1; i++) {
			int first = array[i];
			for (int j = i + 1; j < array.length; j++) {
				int second = array[j];
				if (first == second) {
					index = Math.min(index, j);
				}
			}
		}
		return index == Integer.MAX_VALUE ? -1: array[index];
  }
}

解法二:
用HashSet来发现重复项,不重复,加入set。如果发现重复立刻返回。
Time: O(n) Space: O(n)
代码:

import java.util.*;

class Program {

  public int firstDuplicateValue(int[] array) {
    // Write your code here.
		if (array == null || array.length < 2) return -1;
		HashSet<Integer> set = new HashSet<>();
		for (int val : array) {
			if (set.contains(val)) {
				return val;
			}
			set.add(val);
		}
		return -1;
  }
}

解法三:
首先本解法是建立在这个array里面的整数范围是1-n之间,所以这个解法不会越界。利用一个数组来模仿HashTable来找出重复项,*-1为了标记第一次遇到和第二次遇到两种状态。
Time: O(n) Space: O(1)
代码:

import java.util.*;

class Program {
  //一维数组实现hashTable
	//Abs() 还原原始数值,*-1利用原始数值进行标记(-/+), 两种状态(遇见1/2次)
  public int firstDuplicateValue(int[] array) {
    // Write your code here.
		if (array == null || array.length < 2) return -1;
		for (int val : array) {
			int absVal = Math.abs(val);
			if (array[absVal - 1] < 0) return absVal;
			array[absVal - 1] *= -1;
		}
    return -1;
  }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页