代码随想录训练营 Day1

Leetcode 704 二分搜索

老生常谈,二分搜索。
关于常用的一些tips:
		取vector长度:nums.size()
		除法取整 : /
		取余数:  %
分支法的二分搜索,会涉及很多判断,多次判断一定在循环中进行,且不是遍历的循环。首先确定循环的退出条件(这点在链表的很多题目中都有体现)。此处的判断条件为:left <= right
class Solution {
public:
    int search(vector<int>& nums, int target) {
       
        int left = 0;
        int right = nums.size()-1;
        int result;
        while(left <= right){
            result = (left+right)/2;
            if(target == nums[result]){
                return result;
             }
            if(target > nums[result]){
                left = result+1;
            }
            if(target < nums[result]){
                right = result-1;  
            }
        }
      return -1;
    }
};

Leetcode27 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

暴力解法:两层for循环,一次层找,第二层删。

for(int i = 0; i < nums.size();i++){
  if(nums[i] == val)
  //使用i定位住待删除元素
  		for(int j = i+1; j < nums.size();j++){
  			nums[j-1] = nums[j]; //挪
  			}
  			i--;
  			size--

双指针法

通过快慢指针,在待删除结点上。使得快节点走在慢节点之前。(for循环的判断)然后进行将快指针指向的内容赋值给慢节点指向的内容。

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

                nums[solwpointer] = nums[fastpointer];
                solwpointer++;
           }
       }
       return solwpointer;
    }
};

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