对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。
给定一个 整数 n, 如果是完美数,返回 true,否则返回 false
示例 1:
输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。
示例 2:
输入:num = 6
输出:true
示例 3:
输入:num = 496
输出:true
示例 4:
输入:num = 8128
输出:true
示例 5:
输入:num = 2
输出:false
提示:
1 <= num <= 108
这道题主要是求所给数的因数,只要是因数从小到大相加能得所给得数,即为完美数,所以我们可以使用一个for循环,将每个因数逐个相加即可
class Solution {
public boolean checkPerfectNumber(int num) {
if (num == 1) {
return false;
}
int sum = 1;
for (int d = 2; d * d <= num; ++d) {
if (num % d == 0) {
sum += d;
if (d * d < num) {
sum += num / d;
}
}
}
return sum == num;
}
}
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
这道题给出,一个数组中有两个相等的数,然后返回这两个相同数得下标,所以我们可以定义一个方法实现二分查找,因为这个下标是两个,一个前,一个后。所以我们可以设置一个判断,如果是真,则将mid-1赋值给右端,否则mid+1赋值给左端完成两次数组查找
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res=new int[]{-1,-1};
res[0]=binarySearch(nums,target,true);
res[1]=binarySearch(nums,target,false);
return res;
}
public int binarySearch(int[] nums,int target,boolean leftOrRight){
int res=-1;
int left=0,right=nums.length-1,mid;
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]target){
right=mid-1;
}else{
res=mid;
if(leftOrRight){
right=mid-1;
}else{
left=mid+1;
}
}
}
return res;
}
}
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
这道题是一个递增得二维数组,因为是递增序列,所以我们可以把这个递增的二维数组用二分查找的方式查找,但是又想到是二维数组,所以我们这里可以把二维数组转化成一个一维数组,然后进行二分查找
class Solution{
public boolean searchMatrix(int[][] matrix,int target){
int m=matrix.length,n=matrix[0].length;
int low=0,high=n*m-1;
while(low<=high){
int mid=(high-low)/2+low;
int x=matrix[mid/n][mid%n];
if(xtarget){
high=mid-1;
}else{
return true;
}
}
return false;
}
}