2021年3月26号,力扣刷题记录---Java-数组

数组

35. 搜索插入位置

题目地址

题目描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 4:

输入: [1,3,5,6], 0
输出: 0

思路

二分法查找元素,并将元素进行插入

代码及注释

class Solution {
    public int searchInsert(int[] nums, int target) {
       //二分法进行计算
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        //int mid = (left + right) >> 1;
        // >> 右移运算符,相当于(left + right)/2,但是右移运算符比这种运算符速度要快  
        int ans = len;     
        while (left <= right){               
            int mid = (left + right) >> 1;
            //注释这部分为甚么不能通过,原因待查
            // if (nums[mid] <= target){
            //     ans = mid;
            //     left = mid + 1;
            // }else {
            //     right = mid - 1;
            // }
            if (target <= nums[mid]){
                ans = mid; 
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return ans;
    }
}

27. 移除元素

题目地址

题目描述

你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

现有矩阵 matrix 如下:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

思路

通过(左右)前后指针进行操作

代码及注释

class Solution {
    public int removeElement(int[] nums, int val) {
        //左右指针 即:前后指针
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex++] = nums[fastIndex];
            }
        }

        return slowIndex;
    }
}

59. 螺旋矩阵 II

题目地址

题目描述

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

你可以假设数组中无重复元素。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

思路

设置矩阵的边界,按照插入数据逐个添加到矩阵之中

代码及注释

class Solution {
    public int[][] generateMatrix(int n) {
        //设置矩阵的四个边界
        
        int l = 0, r = n - 1, t = 0, b = n - 1;
        int[][] matrix = new int[n][n];
        int num = 1, target = n * n;
        
        while (num <= target){
        //注意边界包含情况
        //例如矩阵第一行元素,若不包含r,则第一轮有,第一行数值为1 ~ r-1, 即1 ~ n-1
            //left to right
            for (int i = l; i <= r; i++) matrix[t][i] = num++;
            t++;

            //top to bottom
            for (int i = t; i <= b; i++) matrix[i][r] = num++;
            r--;

            //right to left
            for (int i = r; i >= l; i--) matrix[b][i] = num++;
            b--;

            //bottom to top
            for (int i = b; i >= t; i--) matrix[i][l] = num++;
            l++;
        }
        return matrix;
    }
}

209. 长度最小的子数组

题目地址

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

思路

设定窗口大小,并通过result记录。设定左右指针进行处理

代码及注释

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int result = 100010;
        int subLength = 0;//设定窗口长度为0
        int i = 0; //设定左窗口位置
        
        for (int j = 0; j < nums.length; j++){
            sum += nums[j];
            while (sum >= target){
                subLength = j - i + 1;
                result = Math.min(result, subLength);
                sum -= nums[i];
                i++;
            }
        }

        return result == 100010? 0 : result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值