LeetCode-Java day1
进入大学早已度过一年,现如今大二上学期也即将结束,看了看我自己的算法的(虽然大一上早早注册了牛客和力扣的账号)。。。。好吧,大一太过于摸鱼了,于是痛定思痛,决定开启每日两力扣的锻炼之旅!
话不多说,直接开刷!
Leet-----1991.找到数组的中间位置
给你一个下标从 0 开始的整数数组 nums
,请你找到 最左边 的中间位置 middleIndex
(也就是所有可能中间位置下标最小的一个)。
中间位置 middleIndex
是满足 nums[0] + nums[1] + ... + nums[middleIndex-1] == nums[middleIndex+1] + nums[middleIndex+2] + ... + nums[nums.length-1]
的数组下标。
如果 middleIndex == 0
,左边部分的和定义为 0
。类似的,如果 middleIndex == nums.length - 1
,右边部分的和定义为 0
。
请你返回满足上述条件 最左边 的 middleIndex
,如果不存在这样的中间位置,请你返回 -1
。
emmmm,果不其然,看到题目第一想法只有for循环暴力解决------
设置一个索引进行移动,然后移动过程中比较左右两边之和是否相等
class Solution {
public int findMiddleIndex(int[] nums) {
int index=0;
for (int i = 0; i < nums.length; i++) {
int left=0;
int right=0;
for (int j = 0; j <index ; j++) {
left+=nums[j];
}
for (int j = index+1; j <nums.length ; j++) {
right+=nums[j];
}
if(left==right)
{
break;
}
index++;
}
return index>=nums.length?-1:index;
}
}
题目倒是对了。。。但是这也太不优雅了吧~~
最后由于第一次做题有点沉不下心(连怎么思考都貌似没有方向。。),就去翻了翻大佬们的题解。。。真的想给自己一耳刮子。
class Solution {
public int findMiddleIndex(int[] nums) {
int left=0;
int right=0;
for(int num:nums){
right += num;
}
for(int i=0;i<nums.length;i++){
if(i!=0)
{
left+=nums[i-1];
}
right-=nums[i];
if(right==left)
return i;
}
return -1;
}
}
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
嘛。。即使知识再匮乏,也会第一时间想到二分查找了(尤其logn)
开撸开撸
这里主要是注意一下while结束条件防止越界啥的
class Solution {
public int searchInsert(int[] nums, int target) {
int index = nums.length/2;
int l =0;
int r=nums.length-1;
while(l<=r) {
if(target == nums[index])
return index;
if(target>nums[index]){
l=index+1;
}
else{
r=index-1;
}
index=(l+r)/2;
}
return l;
}
}
嘛,写完后也想到可以直接暴力解决,不过感觉不算难这里也就不写出来了。
小结
力扣第一天,还是比较友好,至少是在短时间完成了,害。。。大一就是年少太无知,当时c语言连循环都没学到就来力扣了,真该死,当时直接给咱劝退了,后面学了数组又来了一次,按照序号来做,入坑即退坑(emmm)
第一天就不多说啥了,保留坚持下去的心就好了~~