代码随想录算法训练营第一天| LeetCode704 二分查找,LeetCode35,LeetCode34,leetcode27.移除元素

LeetCode704题目链接:704. 二分查找 - 力扣(LeetCode)

第一时间的想法:

  简单来说,二分法给我的印象就是想一条绳子上打很多的结,每次对折正好是一个结点,我们需要找到想要的结点比如(a)代码思路就是不断对折一直到绳子两端重合中间没有结点,最后剩下的就是要找的结点a了。

        所以要使用是while循环来判断两端结点  数组左右闭区间(left<=right),左闭右开或者左开右闭就没有等于,每次中间值就等于两端之和的一半,当中间值在目标左边时,说明中间值比目标小,必须更改区间来往目标值靠近,所以要将左区间改为middle值的下一位。以此类推,在右边也是一样,当middle值和目标值一样时,直接输出即可。当left=right时,循环结束,还没找到说明目标值不存在,输出-1,

左闭右闭区间代码:

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

 左开右闭区间代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
        while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左区间,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        // 未找到目标值
        return -1;
    }
};

LeetCode35题目链接:35. 搜索插入位置 - 力扣(LeetCode)

思路:简单,不说了。

class Solution {
    public int searchInsert(int[] nums, int target) {
        int index=0;
        for(int i =0;i<nums.length;i++){
            if(nums[i]<target){
                index++;
            }
            
        }
        return index;
        
    
}
}

LeetCode27题目链接:27. 移除元素 - 力扣(LeetCode)

思路:用循环判断与val相同,相同跳过,不同后边取代前边实现移除;

一,暴力破解(双层for循环)

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--; // 此时数组的大小-1
            }
        }
        return size;

    }
};

二,双指针操作:

思路,慢指针充当index,快指针判断是否与val一致,不一致就是新数组要的。

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

 

posted @ 2024-01-17 19:31  22软工冷薄  阅读(60)  评论(0编辑  收藏  举报