c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现
求:
給你一個整數數組?arr,請你檢查是否存在兩個整數?N 和 M,滿足?N?是?M?的兩倍(即,N = 2 * M)。
更正式地,檢查是否存在兩個下標?i 和 j 滿足:
i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]
示例 1:
輸入:arr = [10,2,5,3]
輸出:true
解釋:N = 10 是 M = 5 的兩倍,即 10 = 2 * 5 。
示例 2:
輸入:arr = [7,1,14,11]
輸出:true
解釋:N = 14 是 M = 7 的兩倍,即 14 = 2 * 7 。
示例 3:
輸入:arr = [3,1,7,11]
輸出:false
解釋:在該情況下不存在 N 和 M 滿足 N = 2 * M 。
提示:
2 <= arr.length <= 500
-10^3 <= arr[i] <= 10^3
解:
首先最直觀的想到暴力法,時間復雜度是O(N^2)
bool
checkIfExist(
int
*?arr,
int
arrSize){
int
i,j;
for
(i=
0
;i
for
(j=i+
1
;j
if
(arr[i]==arr[j]*
2
||?arr[j]==arr[i]*
2
)
return
true
;
}
return
false
;
}
對暴力法進行改進,很自然的想到使用哈希表以空間換時間的策略,通過判斷哈希表對應位置上的索引關系,能夠知道是否存在符合題意的一對數。
注意這里有2個細節:
1、數組可能包含數組,而使用數組實現哈希表,索引不能是負數,但是因為題目給出了數的范圍,我們對這個區間統一加上1000,就可以保證索引的有效性。
2、0要單獨處理,否則會因為0的存在導致錯誤的結果。
bool
checkIfExist(
int
*?arr,
int
arrSize){
int
hashMap[
2001
]?=?{
0
};
int
countZero?=
0
;
int
i;
for
(i=
0
;i
if
(arr[i]==
0
)???++countZero;
if
(countZero>=
2
)
return
true
;
hashMap[
1000
+arr[i]]?=
1
;
}
for
(i=
0
;i
if
(arr[i]!=
0
&&?arr[i]%
2
==
0
&&?hashMap[
1000
+arr[i]/
2
]==
1
)
return
true
;
return
false
;
}
總結
以上是生活随笔為你收集整理的c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言调用c语言ads,ADS1.2
- 下一篇: 冯诺依曼机器人_冯·诺依曼型计算机的五大