代码随想录算法训练营第一天

LeetCode题目号

  • 704. 二分查找
  • 27. 移除元素
  • 977.有序数组的平方
  • 总结


704. 二分查找

题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

思路:
手写二分法的关键在于边界处理,需要明确查找区间的定义
左开右开区间先查左边,左开右闭区间先查右边,但都需要避免重复查找,即开区间要跳过mid到下一个位置,不然会死循环

代码:

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

27. 移除元素

题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

思路:
使用相向双指针,当遇到不合格的元素时换一个,直到换无可换

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int j = nums.length,i=0;
        while (i < j) {
            if (nums[i] == val)
                nums[i] = nums[--j];
            else
                i++;
        }
        return j;
    }
}

977.有序数组的平方

题目:
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

思路:
使用相向双指针,每次取一个最大值
Java 中表达式的操作数按 从左到右 的顺序求值

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        int j = nums.length,i=0;
        while (i < j) {
            if (nums[i] == val)
                nums[i] = nums[--j];
            else
                i++;
        }
        return j;
    }
}

总结

Java数组实现了CloneableSerializable接口,方法全部继承自Object(),有length属性,二维数组中各一维数组单独分配,地址不连续,在编译时检查元素类型,不存在泛型类型擦除的问题

可以通过.length获取数组长度

如果不能确定循环次数,最好使用while
一般只有在循环次数明确(可以提高代码可读性),或遍历列表/集合等序列时使用for

你可能感兴趣的:(代码随想录打卡,算法)