第一题
一开始没看标题 于是用了一种遍历来找数(的确效率低下)
然后看了看二分法教程 一会就会了
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length-1,mid;
if(nums[left]>target||nums[right]<target)
return -1;
while(left<=right)
{
mid=(left+right);
if(nums[mid]==target)
return mid;
else if(target>nums[mid])
left=mid+1;
else
right=mid-1;
}
return -1;
}
}
题目中6个数 可能不是基数不好区别
咋就在案例中加个1 凑个基数
-1 0 1 3 5 9 12
left为最左边 right为最后边的数 mid为中间数,第一次判断中间数 则为下标3 也是数组中的数字3。
假设target为0,而target小于这个3 所以我们可以把下标3包括后面大于他的下标都可以不管了,所以可以直接让right=mid-1;界限划分到-1到1中。再用一次二分法,结果就出来了。右边同样如此。
2.
第一次编码的时候,发现超内存了(尴尬,于是去找了其它方法试试)
然后想了想,如果直接找这个数的的左右界限不就可以了
class Solution{
public List<Integer> targetIndices(int[] nums, int target) {
Arrays.sort(nums);
int l=0,r=nums.length-1;
while(l<=r){
int mid=(r-l)/2+l;
if (nums[mid]>=target)
r=mid-1;
else l=mid+1;
}
int left=l;
l=0;
r =nums.length-1;
while(l<=r){
int mid=(r-l)/2+l;
if(nums[mid]>target)
r=mid-1;
else l=mid+1;
}
ArrayList<Integer> list=new ArrayList<>();
for(int i=left;i<=r;i++){
list.add(i);
}
return list;
}
}
3.
(一开始就想着遍历,但是的确麻烦且不满足题目要求),后来用的哈希表(好像也不符合条件,快慢指针没学过...之后好好学一学)
class Solution {
public int findDuplicate(int[] nums) {
Set<Integer> b1=new HashSet<Integer>();
for(int num:nums){
if(b1.contains(num)){
return num;
}
b1.add(num);
}
return 0;
}
}
4.Problem - 1692E - Codeforceshttps://codeforces.com/problemset/problem/1692/E
嗯,依旧蒙圈