数组理论基础,704. 二分查找,27. 移除元素
数组基本知识的学习
首先数组的定义就是一类相同元素的集合,其在计算机中的储存空间的地址是连续的,我自己使用的c++是这样的,有些语言比如java的二维数组就是不连续的。
查找数组一指定元素时的方法:二分法
要求数组是有序且无重复元素。
主要学习了其两种边界如何进行处理,分别是在[left,right]和[left,right)进行二分查找,两种主要的不同就是循环的条件[left,right]中left可以==right所以其while循环的条件是(left<=right),[left,right)中不存在left==right的情况,所以其while循环的条件是(left<while)。
[left,right]中,middle=left+(right-left)>>1防止溢出,重新确立边界是因为其left,right两边都为闭,最后都会查找到,所以left=middle+1,right=middle-1。
[left,right)中,middle=left+(right-left)>>1防止溢出,重新确立边界是因为其left为闭,right为开,最后为保证right查找到,所以left=middle+1,right=middle。
代码都省略了,就只要知道其边界的不同如何改变边界就行。
删除数组中的元素
题目是力扣.27的题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目介绍省略
一种是暴力写法和双指针。
暴力解法是两次遍历数组,第一次遍历发现要删除的元素,第二次就是整个数组向右移。
双指针解法就是采用一个快指针和一个慢指针同时遍历数组,快指针没发现要删除的元素,将快指针指向的元素赋给慢指针指向元素,同时将慢指针指向下一元素,如果发现了,慢指针不动,这个过程中,快指针一直向右移动,慢指针根据快指针只想元素的值判断是否向右移动。最后返回慢指针的值就可,题目不要求对数组后面的值进行操作,如果进行操作也很简单,全部赋值0即可。
class Solution { public: int removeElement(vector<int>& nums, int val) { int slowIndex=0; for(int fastIndex=0;fastIndex<nums.size();fastIndex++) { if(nums[fastIndex]!=val) nums[slowIndex++]=nums[fastIndex]; } return slowIndex; } }; |