数组中只有一个重复的整数,寻找这个重复数

题目描述

leetcode 题目链接:https://leetcode-cn.com/problems/find-the-duplicate-number/submissions/
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

示例 1:

输入: [1,3,4,2,2]
输出: 2

示例 2:

输入: [3,1,3,4,2]
输出: 3

理解分析

1.暴力方法:

先排序,
排序之后重复的元素相邻。
则如果存在 nums[i] == nums[i+1],则直接返回 重复的数。
数组中只有一个重复的整数,寻找这个重复数_第1张图片

代码

package leetcode;

import java.util.Arrays;

class Solution {
    public int findDuplicate(int[] nums) {
        Arrays.sort(nums);
        for(int i=0; i<nums.length-1; i++) {
            if (nums[i] == nums[i+1]) {
                return nums[i];
            }
        }

        return -1;
    }
}
// 测试
public class Test {
    public static void main(String[] args) {
        int[] nums = {3,1,3,4,2};
        Solution solution = new Solution();
        System.out.println(solution.findDuplicate(nums));
    }
}

通过 leetcode 测试用例:
数组中只有一个重复的整数,寻找这个重复数_第2张图片

2. 快慢指针:

遍历数组,
每次访问的时候判断,如果这次访问的元素之前被访问过,则直接这次访问的元素之前那访问过,返回这个元素的原来的值(之前用temp保存了)。
否则,置访问过的元素为 0,
保存上一次访问的数组的值(temp = nums[i])。
数组中只有一个重复的整数,寻找这个重复数_第3张图片

优化

class Solution {
    public int findDuplicate(int[] nums) {
        int i = 0;
        int temp = 0;
        while (true) {
            //这次访问的元素之前那访问过,返回这个元素的原来的值
            if (nums[i] == 0) {
                return temp;
            }
            temp = nums[i];
            nums[i] = 0;
            i = temp;
        }
    }
}

通过 leetcode 测试用例,优化了时间复杂度:
数组中只有一个重复的整数,寻找这个重复数_第4张图片

你可能感兴趣的:(刷题)