数组是存放在连续内存空间上的相同类型数据的集合
数组的元素是不能删的,只能覆盖,如果想要使用移除元素的库函数,可以使用vector中的erase函数删除数组中的某某元素,但是要注意,这里的erase操作,也是一个覆盖的过程,后面的数据一个挨一个覆盖前面删除数据的位置,因此这是一个O(n)操作,不是O(1)操作.
数组是有序数组,且数组中没有重复的元素,这也是二分法使用的前提条件
对于自己想出的这种简单粗暴的解法,还有两个疑问
Q1 : 就是题目给出的示例中,并没有输入数组中含有多少个元素,这里数组的定义如何解决?
A:leecode中已经给出了定义的类和数组,在里面书写即可。
Q2 :就是最终如果数组中没有元素与target相等的话,那最终的-1怎么输出?
A:这个最后在循环之外返回-1就好啦。
class Solution {
public:
int search(vector& nums, int target) {
for(int i=0;i
定义 target 是在左闭右闭的区间[left, right] 里,那么此时需要满足两点:
class Solution {
public:
int search(vector& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left<=right)
{
// int middle = (left+right)/2; 这样写可能会出现溢出的情况
//int middle = left + ((right - left)/2); //这样写更保险一点放止溢出
int middle = left + ((right-left)>>1);//使用位运算效率会更高一些
if(nums[middle]>target)
{
right = middle-1;
}
else if(nums[middle]
定义 target 是在一个在左闭右开的区间里,也就是[left, right),此时需要满足如下两点:
class Solution {
public:
int search(vector& nums, int target) {
int left = 0;
int right = nums.size();
while(lefttarget)
{
right = middle;
}
else if(nums[middle]
遍历数组中所有的元素,将数组中的每一个元素与val比较,如果遇到相等的情况,则将该处的数据用下一个数据顶上,即nums[i]=nums[i+1],直到所有的元素都遍历完成。
这样粗暴的方法有两个疑问:
Q1:nums[i+1]该怎么处理?如果出现数据覆盖的情况,后面的数据应该都要移动,那这个批量移动该怎么办?
A1:可以在大循环里面,使用一个小循环,遍历后面的所有元素,将后面每一个元素赋值给对应的前一个元素。
Q2:最终输出的是既有数组的大小又有处理完之后的数组,这个输出有怎么解决?
A2:这个的话,内部将返回了数组的大小,做一个for循环,输出了数组。
class Solution {
public:
int removeElement(vector& nums, int val) {
for(int i=0;i
class Solution {
public:
int removeElement(vector& nums, int val) {
int nums_size = nums.size();
for(int i=0;i
通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
这种方法并没有改变元素的相对位置。
class Solution {
public:
int removeElement(vector& nums, int val) {
int slow = 0;
for(int fast = 0;fast
今天花了大概3个小时的时间学习了这些知识,掌握了有序无重复数组下的二分法解题以及双指针移除元素法,蛮有收获的。