Arrays分类算法-First Duplicate Value

这篇博客探讨了三种解决算法问题的方法,目标是找到数组中第一个重复的值。第一种方法是暴力求解,时间复杂度为O(n^2),第二种方法使用HashSet,时间复杂度为O(n),空间复杂度为O(n),第三种方法利用辅助数组模拟HashTable,时间复杂度和空间复杂度均为O(1)。
摘要由CSDN通过智能技术生成
题目要求在这里插入图片描述

解法一:
暴力解法,找到数组中相同的两个数,然后返回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;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值