首页 > 编程语言 >算法随想录打卡第一天|704. 二分查找、27. 移除元素

算法随想录打卡第一天|704. 二分查找、27. 移除元素

时间:2024-05-22 13:08:46浏览次数:32  
标签:right nums int 随想录 mid len 移除 打卡 left

704. 二分查找 - 力扣(LeetCode)

自己的解法是这样的,超出了时间限制,现在觉得应该是在mid的计算中出了问题。

然后在mid的转换中没有right减去1或者left加上1。这两点的问题。

自己很习惯的方式是左闭合加上右闭合。可以省去很多对于临界值忘记考虑的麻烦。

超时代码贴出:

public int search(int[] nums, int target) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid;
            } else if (nums[mid] > target) {
                right = mid;
            }
        }
        return -1;
    }

改进后的代码。代码是一个很抠细节的东西。

public static int search(int[] nums, int target) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        //左闭合右闭合
        while (left <= right) {
            int mid = left + (right - left) / 2;//防止想加以后溢出(left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;//挪一位mid;
            } else if (nums[mid] > target) {
                right = mid - 1;//挪一位mid;
            }
        }
        return -1;
    }

27. 移除元素 - 力扣(LeetCode)

这题真的是小题大做了,改了很多版本以后,边界问题得不到解决。最终觉得不太适合左右端点往中间移动的双指针这样的模式。适合快慢双指针。

public int removeElement(int[] nums, int val) {
        int left = 0;
        int len = nums.length;
        int right = len - 1;
        int count = 0;
        // 需要找的最多次数就是len次,len从前往后找,
        // 找到以后和right对调,对调以后right左移动一个单位
        // 有一个极限情况,左边不等于val时,右边刚好等于val
        // 左边发现和val相等的元素时,元素是交换
        while (left <= right) {
            if (nums[left] != val) {
                left++;
                if (nums[right] == val) {
                    right--;
                    count++;
                }
            } else {
                count++;
                //交换
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                left++;
                right--;
            }
        }
        return count;
    }

快慢双指针的方法:

这里的++i和i++结合运用的非常巧妙,感觉跟我这个二分法的mid没有前移一位或者后移一位我在这里犯了同样的错误。i是快指针,快指针找到目标值以后直接赋值给慢指针的位置。

但是我考虑到一个慢指针原来的值被丢弃的问题。

后来想到了,因为慢指针所到之处,快指针肯定都经过了,所以,需要的值肯定都已经存好了,所以不会有这个问题。也不需要追加一个数组作为内存开销。

public static int removeElement(int[] nums, int val) {
        int size = nums.length;
        int cnt = 0;
        for(int i = 0;i < size; ++i){
            if(nums[i] != val){
                nums[cnt++] = nums[i];
            }
        }
        return cnt;
    }

 

标签:right,nums,int,随想录,mid,len,移除,打卡,left
From: https://www.cnblogs.com/daihao547/p/18206040

相关文章

  • 代码随想录算法训练营第十四天 | 二叉树遍历
    递归法文章讲解视频讲解递归三要素:1确定递归函数的参数和返回值2确定终止条件3确定单层递归的逻辑前序遍历题目链接递归的参数和返回值:传入当前节点和保存结果集的数组,不需要返回值终止条件:当前节点为空时单层递归逻辑:保存当前节点的值到结果集中classSolution......
  • 代码随想录算法训练营第第14天 | 二叉树递归遍历(递归法、迭代、统一的迭代方法)
    递归遍历(必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html迭代遍历(基础不好的录友,迭代法可以放过)题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的迭代遍历.html统一迭代......
  • 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值 347. 前k个高频元素
    239.滑动窗口最大值题目链接文章讲解视频讲解思路:使用单调队列,来维护有可能成为最大值的元素;   当窗口向右滑动时,判断移除的元素是否是队首元素如果是的话出队;   新加入的元素依次和队尾元素作比较,如果大于队尾元素则将队尾元素循环出队,这样可以保证队列中始终维持......
  • iOS 移除所有通过Cocoapod安装的第三库
    要移除所有通过CocoaPods安装的第三方库,你可以执行以下步骤:打开终端。转到包含你的Xcode项目的目录。转到目标目录下cd/path/to/your/project。后续指令操作都是在目标项目目录下进行。如果你的Podfile文件还存在,删除它。也可以在终端使用指令rmPodfile删除运行......
  • 代码随想录算法训练营第十一天 | 20.有效的括号 1047.删除字符串中的所有相邻 重复项
    20.有效的括号题目链接文章讲解视频讲解思路:遍历字符串,如果栈不为空,则进行匹配   如果匹配则出栈,否则入栈   如果栈为空,直接入栈   遍历结束后栈为空则说明全部匹配,否则没有全部匹配classSolution{public:boolisValid(strings){stack<cha......
  • 代码随想录算法训练营第第11天 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重
    今天的题主要是关于栈的,比较简单,一次性过20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.......
  • 代码随想录算法训练营第第九天 | 28. 实现 strStr() 、459.重复的子字符串
    实现strStr()因为KMP算法很难,大家别奢求一次就把kmp全理解了,大家刚学KMP一定会有各种各样的疑问,先留着,别期望立刻啃明白,第一遍了解大概思路,二刷的时候,再看KMP会好懂很多。或者说大家可以放弃一刷可以不看KMP,今天来回顾一下之前的算法题目就可以。因为大家算法能力还没到,......
  • 《代码随想录》-3.长度最小的子数组
    题目:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和≥s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。滑动窗口:只用一个for循环,其索引指向窗口终点位置窗口是满足其和>=s的最小长度的连续数组当窗口大于等于s,起始位置就要......
  • 代码随想录算法训练营第八天 | 344.反转字符串 替换数字
    344.反转字符串题目链接文章讲解视频讲解时间复杂度o(n)空间复杂度o(1)思路:双指针解决,和翻转数组一样classSolution{public:voidreverseString(vector<char>&s){intleft=0,right=s.size()-1;while(left<right){......
  • 代码随想录算法训练营第第八天 | 344.反转字符串 、541. 反转字符串II、卡码网:54.替
    344.反转字符串建议:本题是字符串基础题目,就是考察reverse函数的实现,同时也明确一下平时刷题什么时候用库函数,什么时候不用库函数题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.反转字符串.html/***@param{character[]}s*@return{void}Donotret......