給定一陣列,裡面的數字為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#includeusing
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 示例 ...