tag数组-刷题预备知识-0.1 一维数组 + lt.724 寻找数组的中心下标 + lt.35 搜索插入位置 3

数组的随机访问方法

1.1 Leetcode 724 寻找数组的中心下标(easy)

[案例需求]

给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。

注意:中心下标可能出现在数组的两端。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 (1 + 7 + 3 = 11),
右侧数之和 (5 + 6 = 11) ,二者相等。

示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。

示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
下标 0 左侧不存在元素,视作和为 0 ;
右侧数之和为 1 + (-1) = 0 ,二者相等。

[思路分析]

先计算总的和,右边元素的和=总和-左边元素的和-当前元素,
所以在实际的计算中, 我们只需要遍历计算出数组的总和sum0, 然后再一次遍历数组, 实现以下功能
//1. 用i记录当前元素
//2. 通过加减运算得出右边元素的和
//3. 比较总和 ?= 左边元素和 + 当前元素和 + 右边元素和
//4. 记录左边元素的和(为什么这是最后一步, 因为我们一定要记得考虑数组的中间下标为0的情况! 此时 左边元素和为0, 举个栗子: nums=[1,-1,1], 输出0)

[代码实现]

class Solution {    
      public static int pivotIndex(int[] nums) {
        //1. 求出数组总和
        //2. 用i记录当前元素
        //3. 求出i左边元素的和,
        //4. 求出i右边元素的和
        //比较总和 ?= 左边元素和 + 当前元素和 + 右边元素和
        int sum0 = 0;
        int sumLeft = 0;
        int sumRight = 0;
        for(int x : nums){
            sum0 += x;
        }
        if( sum0 - nums[0] == 0) return 0;
        for(int i=0; i<=nums.length-1; i++){
            //判断当前元素的左右是否相等
            int tmp = nums[i];
            //右边元素的和(加减得出)
            sumRight = sum0 - tmp - sumLeft;
            if(sumLeft == sumRight){
                return i;
            }
            //当前元素左边的和
            sumLeft += nums[i];
        }
        return -1;
    }

}

在这里插入图片描述

1.2 LeetCode 35 搜索插入位置(easy)

[案例需求]

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

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

示例 1:

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

示例 2:

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

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

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

[思路分析]

  1. 返回结果: 索引
  2. 找到数组的值, 或者找到了第一个比这个数大的数, 返回所在的索引
  3. 未找到, 返回数组长度

[代码实现]

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

在这里插入图片描述

虽然通过了,但是这个求法太low了, 待补充: 二分查找 ✔ ;

一定要先通读一下这篇文章噢: 点我
二分查找补充如下:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while(left <= right){
            int mid = left + (right - left) / 2;
            
            if(target == nums[mid]) return mid;

            if(target < nums[mid]){
                right = mid - 1;
            }else if(target > nums[mid]){
                left = mid + 1;
            }
        }

        return left;
    }
}
posted @ 2022-05-26 20:31  青松城  阅读(20)  评论(0编辑  收藏  举报