自己可以做电子商务网站网站制作哪里好薇
自己可以做电子商务网站,网站制作哪里好薇,黄页推广2021,我的网站是面向全国的选哪个公司的服务器比较好题目链接#xff1a;2576. 求出最多标记下标#xff08;中等#xff09; 算法原理#xff1a; 解法一#xff1a;排序双指针贪心 33ms击败79.27% 时间复杂度O(Nlogn) 首先我们思考一件事情#xff1a;当一个大的数遇到一堆小的数时#xff0c;在同样满足2小的数≤大的数…题目链接2576. 求出最多标记下标中等算法原理解法一排序双指针贪心33ms击败79.27%时间复杂度O(Nlogn)首先我们思考一件事情当一个大的数遇到一堆小的数时在同样满足2×小的数≤大的数的情况下咱们选这些小的数中偏小的还是偏大的那肯定选偏大的啊因为偏小的可能还能与后续大的数再凑一对这贪心的思想就来了①我们要找大的数和小的数就要先排序②从中间劈开分别找满足题述条件的2*nums[i] nums[j]的数如果当前的大数能跟前面小的数匹配上ret2left和right同时往后走如果匹配不上说明当前大数小了要right往后走再继续匹配解法二二分查找35ms击败43.90%时间复杂度O(Nlogn)①目标变量对数②目标条件对数最多③转换逻辑在mid对的情况下能否满足2 * nums[i] nums[j]的条件具体步骤①确定边界left0最少0对rightn/2n为数组长度最多时所有数都能组成一对②确定二分模型由于要找最大对数因此采用最右端点模型如果没有mid对说明mid太大了属于最右端点的右边需要返回true缩小mid向左调整③check方法设计判断方法跟解法一类似都是贪心的思想但不完全相同如果数组长度为10我们在找3对时只需判断3个最大元素和3个最小元素能否配对即可如果这都没有3对那就更不可能再凑3对了Java代码class Solution { //解法一排序双指针贪心 public int maxNumOfMarkedIndices(int[] nums) { Arrays.sort(nums); int nnums.length; int left0,right(n1)/2; int ret0; while(leftn/2rightn){ if(2*nums[left]nums[right]){ ret2; left;right; }else right; } return ret; } }class Solution { //解法二二分查找 public int maxNumOfMarkedIndices(int[] nums) { Arrays.sort(nums); int nnums.length; int left0,rightn/2; int ret0; while(leftright){ int midleft(right-left1)/2; if(check(mid,nums)) rightmid-1; else leftmid; } return left*2; } //如果不能找到mid对则说明mid太大了返回true需要向左调整 private boolean check(int mid,int[] nums){ //0对一定可行无需向更小调整 if(mid0) return false; int nnums.length; //贪心验证前mid个最小元素配对最后mid个最大元素 for(int i0;imid;i) //有一个不满足mid对就达不到 if(2*nums[i]nums[n-midi]) return true; return false; } }