704 二分查找
题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 链接:704.二分查找
思路
暴力解简单
二分查找也就简单的中分查找
代码
class Solution { public int search(int[] nums, int target) { int n = nums.length; int pos = -1; int low = 0; int high = n-1; int mid = 0; while(low<=high){ mid = (low+high)/2; if (nums[mid] == target){ pos = mid; break; } else if (nums[mid] > target){ high = mid-1; } else{ low = mid +1; } } return pos; } }
过程
while循环,low<=high,第一时间写成了<;导致失败
总结
mid = (low + high ) / 2 可写成 mid = low + (high - low )/ 2 防止溢出,但是也就少一位
27 移除元素
题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
链接:27.移除元素
思路
双指针,调换位置
代码
class Solution { public int removeElement(int[] nums, int val) { int left = 0; int len = nums.length; if(len != 0 ){ int right = len - 1; int s = 0; while ( nums[right] == val ){ right--; len -- ; if( right == -1)break; }//此时,right要么 = -1 即nums为空, 要么right指向非val,nums不为空 while ( left < right ){ if (nums[left] == val){ nums[left] = nums[right]; len -- ; right -- ; while ( nums[right] == val ){ right--; len -- ; } } left++; } } return len; } }
过程
开始是 high 初始没判断
先是 {1} 中找1,要考虑low 和high 的关系
然后又有个 空集 找 0 ,
然后发现不用调换位置,直接左=右即可,右边即使要处理也全是 val
只能在循环体内break
总结
找找数组题 考虑边界条件 的方法论。
好吧题解还没看,先打卡
今日总结
学习时长3h
emm又是摆烂的一天,明天一定!
就写了两道算法,哦新手村还写了四道,还剩两道
1480 一维数组的动态和 注意原地修改
1342 将数字变成 0 的操作次数 注意可以用二进制位运算
更进一步,操作次数 = 总位数-1(左移一次表示除以2) + “1”个数(1表示该位需要先减一)
1672 最富有客户的资产总量 查了一下怎么找二维数组长度
nums.length 即可表示
对于 nums[i][j] ,i = nums.length //i行 , j = nums[i].length //j列
412 Fizz Buzz
对于字符串 sur =‘’ 为啥 sur += i 运行时长(2ms) 比sur = ‘ ’ + i 长?