(演算法)只出現一次的最小數

2021-09-08 11:25:55 字數 1106 閱讀 5492

給定一陣列,裡面的數字為1~n,每個數出現一次或兩次,求只出現一次的最小數。

要求:空間複雜度:o(1),時間複雜度:o(n)

題目給定的數字為1~n,因此可以通過交換的方法,將陣列下標與數字對應存放,如數字1與下標為0的數字交換,數字3與下標為2的數字交換。

下面給出兩種不同的交換思路:

1、假設每個數都出現兩次,那麼1存放的位置應該為0,1;2存放的位置應該為2,3;n存放的位置應該為2*(n-1),2*(n-1)+1.

如果出現2*(n-1),2*(n-1)+1大於陣列長度,即可忽略,繼續往前遍歷交換。

這樣交換完了之後,就會出現112233445x667788...這樣的陣列,再從頭遍歷一遍即可找出只出現一次的最小數。

2、對交換的數字做標記,例如某個位置i被標識為-1,即標識數字i+1出現了1次,某個位置i被標識為-2,即標識數字i+1出現了2次。

這樣交換和標識完了之後,就會出現-2-2-1-2-1-2-1...這樣的陣列,再從頭遍歷一遍即可找出只出現一次的最小數。

#include#include

using

namespace

std;

void swap(int &a,int &b)

n)

if(i==2*num+1 && a[2*num]==a[2*num+1

])

if(a[2*num]==a[i])

else

swap(a[

2*num],a[i]);

}for(int i=0;i2

)

return -1;}

n)

if(i1 && i+1==a[i])

if(a[a[i]-1]==-1

)

else

//else

} }

for(int i=0;i)

}int

main();

int n=sizeof(a)/sizeof(a[0

]); cout

int b=;

cout

return0;

}

演算法 只出現一次的數字

1.leetcode136 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。要求時間複雜度o n 空間複雜度o 1 示例 輸入 4,1,2,1,2 輸出4 1 面試官不想要的答案 建字典 排序。2 面試官想要的答案 位運算。思路 如果我們對 0 ...

swift演算法 只出現一次的數字

1 描述 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次,找出那個只出現一次的元素。例1 輸入 2,2,1 輸出 1 例2 輸入 4,1,2,1,2 輸出 4 2 演算法 1 利用陣列 思想 利用陣列,遍歷nums中的每乙個元素,如果是新出現則加入陣列,如果已經在列表則刪除...

每日演算法 只出現一次的數字

目錄 題目1 只出現一次 解題思路 題目2 目標數出現一次,其餘出現3次 解題思路 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 ...