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
[思路分析]
- 返回结果: 索引
- 找到数组的值, 或者找到了第一个比这个数大的数, 返回所在的索引
- 未找到, 返回数组长度
[代码实现]
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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)