给你一个整数数组 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:
[-2,0,10,-19,4,6,-8]
解题思路1:
1、暴力破解
2、借用辅助数组存储原数组相应位置各元素的*2的值,然后再判断辅助数组中是否存在位置不同但值是原数组元素的2倍的元素。
public class CheckIfExist {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组: ");
int [] nums = new int[7];
for (int i = 0; i < nums.length; i++) {
nums[i] = scanner.nextInt();
}
boolean flag = checkIfExist(nums);
System.out.println(flag);
}
public static boolean checkIfExist(int[] arr) {
if (arr == null){
return false;
}
int [] temp = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
temp[i] = arr[i] * 2;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (temp[j] == arr[i] && (i != j)){
return true;
}
}
}
return false;
}
}
解题思路2:
遍历数组,并将数组类似字典存数组,即map<key,value>
key: 数组元素,value: 1, 然后再判断数组元素%2 ==0 并且 map中存在2*数组元素或者数组元素/2.
public static boolean checkIfExist1(int [] nums){
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if ((nums[i] % 2 == 0 && map.containsKey(nums[i] / 2)) || map.containsKey(nums[i] * 2)){
return true;
}
map.put(nums[i],1);
}
return false;
}