算法学习day1

算法学习day1

  • 数组理论基础
  • 二分查找法-力扣704题
  • 移除元素-力扣27题

数组理论基础

1.数组是存放在连续内存空间上的相同类型数据的集合。
2.数组下标都是从0开始,内存空间是连续的。
正是因为数组在内存空间的地址是连续的,所以我们在删除或者添加其他元素的时候难免需要移动其他元素的地址。

二分查找法-力扣704题

二分查找法需要注意:定义的区间是左闭右闭还是左闭右开区间。这决定了循环中while(left <=right)是否含有等于号,以及左右区间在收缩的时候是否需要加减1.

1.二分法(左闭右闭区间)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //1.左闭右闭区间写法
        int left = 0;
        int right = nums.size() - 1;//因为是左闭右闭,right需要用。所以为size-1

        //开始循环
        while( left <= right){//因为循环区间为[left,right] 所以需要加等号
            int mid = left + ( (right - left) >> 1);

            //开始判断是否为目标值
            if( nums[mid] > target ){//说明目标值落在左区间,故右边界缩小
                right = mid - 1;
            }
            else if ( nums[mid] < target ){//说明目标值落在右区间,故缩小左边界
                left = mid + 1;
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

2.二分法(左闭右开区间)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //2.左闭右开写法
        int left = 0;
        int right = nums.size();

        //开始循环
        while( left < right ){//区间为左闭右开,所以left == right 没有意义
            int mid = left + ((right - left) >> 1 );

            //开始判断
            if( nums[mid] > target ){//当target小于,说明落在区间左侧。缩小右边界
                right = mid;//保持左闭右开
            }
            else if ( nums[mid] < target){//当target大于,说明落在区间右侧,增加左边界
                left = mid + 1;//保持左闭右开
            }
            else{
                return mid;
            }
        }
        return -1;
    }
};

移除元素-力扣27题

1.暴力法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for(int i = 0 ; i < size ; i++){
            if(nums[i] == val){
                for(int j = i+1 ; j < size ; j++){
                    nums[j-1] = nums[j];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--;            
            }     
        }
        return size;
    }
};

2.双指针法
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for( int fast = 0 ; fast < nums.size() ; fast++){
            if( nums[fast] != val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
};

你可能感兴趣的:(算法,数据结构,leetcode,c++)