摘要:題目要求存在一個整數(shù)數(shù)組,其中的所有元素都位于之間,其中是數(shù)組的長度。有的元素出現(xiàn)了一次,而有的元素出現(xiàn)了兩次。思路一交換為了在的時間內(nèi)找到所有的出現(xiàn)兩次的數(shù)字,其核心要求在于用現(xiàn)有的數(shù)組記錄已經(jīng)訪問過的元素,同時不會丟失尚未訪問過的元素。
題目要求
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,8,2,3,1] Output: [2,3]
存在一個整數(shù)數(shù)組,其中的所有元素都位于1~n之間,其中n是數(shù)組的長度。有的元素出現(xiàn)了一次,而有的元素出現(xiàn)了兩次。找到數(shù)組中所有出現(xiàn)兩次的數(shù)字。
思路一:交換為了在O(N)的時間內(nèi)找到所有的出現(xiàn)兩次的數(shù)字,其核心要求在于用現(xiàn)有的數(shù)組記錄已經(jīng)訪問過的元素,同時不會丟失尚未訪問過的元素。思路一采用交換的核心思想,即每次都將當(dāng)前下標(biāo)上的值和以該值為下標(biāo)的位置上的值進行交換,如果該值下標(biāo)位置上的值和其相等,則說明該數(shù)字已經(jīng)被遍歷過一遍了。
代碼如下:
public List思路二:取反findDuplicates(int[] nums) { int index = 0; List result = new ArrayList (); while(index < nums.length) { int num = nums[index]; if(num == 0){ index++; }else if (nums[num-1] == num) { if(index != num-1){ result.add(num); nums[index] = 0; } index++; }else{ swap(index, num-1, nums); } } return result; } public void swap(int i, int j, int[] nums) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }
有沒有一種辦法在既保留當(dāng)前位置上的值nums[i]的同時,又能夠用某種方式記錄i+1是否已經(jīng)被訪問過了?可以通過取反的方法來記錄是否被訪問過這個情況。如果訪問到下標(biāo)為i的位置上的值,則去判斷nums[nums[i]-1]位置上的值是否為負數(shù),如果是,則說明num[i]出現(xiàn)了兩次,否則將nums[nums[i]-1]位置上的值取反保留。
代碼如下:
public ListfindDuplicates(int[] nums) { List res = new ArrayList<>(); for (int i = 0; i < nums.length; ++i) { int index = Math.abs(nums[i])-1; if (nums[index] < 0) res.add(Math.abs(index+1)); nums[index] = -nums[index]; } return res; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75113.html
Problem Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without ...
摘要:在線網(wǎng)站地址我的微信公眾號完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個題。這是項目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號: showImg(htt...
Problem Given an integer array, your task is to find all the different possible increasing subsequences of the given array, and the length of an increasing subsequence should be at least 2 . Example: ...
摘要:代碼集合法復(fù)雜度時間空間思路同樣使用集合,但這次我們要維護集合的大小不超過,相當(dāng)于是記錄一個寬度為的窗口中出現(xiàn)過的數(shù)字。 Contains Duplicate I Given an array of integers, find if the array contains any duplicates. Your function should return true if any v...
摘要:輸入一個整數(shù)數(shù)組,查看數(shù)組中是否存在重復(fù)的值。新的數(shù)組中數(shù)組的下標(biāo)為原數(shù)組的值,如果遍歷過,則設(shè)置為。這里使用了作為實現(xiàn)的數(shù)據(jù)結(jié)構(gòu),通過堆的形式對集合中的數(shù)據(jù)進行存儲,從而我們可以通過某種順序獲得該集合中的所有順序。 217 Contains Duplicate Given an array of integers, find if the array contains any dup...
閱讀 693·2021-11-18 10:07
閱讀 2884·2021-09-22 16:04
閱讀 884·2021-08-16 10:50
閱讀 3349·2019-08-30 15:56
閱讀 1790·2019-08-29 13:22
閱讀 2670·2019-08-26 17:15
閱讀 1239·2019-08-26 10:57
閱讀 1112·2019-08-23 15:23