2026/1/15 10:03:05
网站建设
项目流程
给企业做网站,济宁网站建设 优化培训,湖北洈水水利水电建设公司网站,网站不备案有什么影响题目链接#xff1a;1283. 使结果不超过阈值的最小除数#xff08;中等#xff09; 算法原理#xff1a; 解法#xff1a;二分查找 6ms击败94.13% 时间复杂度O(nlog(max_num)) 因为是找最小#xff0c;在左边#xff0c;因此选用最左端点模型 ①题目没说一定升序#x…题目链接1283. 使结果不超过阈值的最小除数中等算法原理解法二分查找6ms击败94.13%时间复杂度O(n×log(max_num))因为是找最小在左边因此选用最左端点模型①题目没说一定升序且除数一旦大于最大值之后结果都是1因此right要取数组中的最大值需要O(N)时间复杂度的一次遍历②分析要找的目标值来分析left和right最终的位置写出判断方法check判断当前mid作为除数是否符合t的条件③如果mid在最左端点的左边那么leftmid1此时分析check方法分析如上图对应的值应该是false④咱们要找的就是未知的符合条件的最左端点所以left最终的位置即答案无需分析第二落到的位置⑤小细节left初始化为1因为当最左端点就是left落到的位置时0不能做除数除数最小也是1Java代码class Solution { public int smallestDivisor(int[] nums, int t) { //除数不能是0所以left初始化为1 int left1,right0; for(int x:nums) rightMath.max(x,right); //找除数最小最左端点模型 while(leftright){ int midleft(right-left)/2; if(!check(nums,mid,t)) leftmid1; else rightmid; } return left; } private boolean check(int[] nums,int mid,int t){ int sum0; for(int x:nums){ //mid-1补足余数完成向上取整 sum(xmid-1)/mid; if(sumt) return false; } return true; } }