力扣1346(java&python)-检查整数及其两倍数是否存在(简单)

题目:

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/check-if-n-and-its-double-exist
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一看明白题意是返回true或者flase,就想到可以把数组进行排序变成一个有序的数组,然后再使用二分查找,考虑到查找倍数为2的数,本题的解题关键在于,如何确定最初的查找范围

如 [-4,-3,-2,0,1,4] 若满足条件的为负数,则查找区间应在该数的左半区域
如 [0,1,3,5,10,11] 若满足条件的为正数,则查找区间应在该数的右半区域

java代码:

 1 class Solution {
 2     public boolean checkIfExist(int[] arr) {
 3         Arrays.sort(arr);
 4         int n = arr.length;
 5         for (int i = 0; i < n; i++){
 6             int left = 0, right = n - 1;
 7             if (arr[i] >= 0){
 8                 left = i + 1;
 9             }else {
10                 right = i - 1;
11             }
12             while (left <= right){
13                 int mid = left + (right - left) / 2;
14                 if (arr[mid] < arr[i] * 2){
15                     left = mid + 1;
16                 }else if (arr[mid] > arr[i] * 2){
17                     right = mid - 1;
18                 }else{
19                     return true;
20                 }
21             }
22         }
23         return false;
24     }
25 }

 python3代码:

 1 class Solution:
 2     def checkIfExist(self, arr: List[int]) -> bool:
 3         n = len(arr)
 4         arr.sort()
 5         for i in range(n):
 6             left, right = 0 , n - 1
 7             if arr[i] < 0:
 8                 right = i - 1
 9             else:
10                 left = i + 1
11             while left <= right:
12                 mid = left + (right - left) // 2
13                 if arr[mid] > arr[i] * 2:
14                     right = mid - 1
15                 elif arr[mid] < arr[i] * 2:
16                     left = mid + 1
17                 else:
18                     return True
19         return False

posted on 2022-12-14 22:06  我不想一直当菜鸟  阅读(71)  评论(0编辑  收藏  举报