未优化版:
216 / 216 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 38.5 MB
// 5938. 找出数组排序后的目标下标
class Solution {
public List<Integer> targetIndices(int[] nums, int target) {
// 排序
Arrays.sort(nums);
// 使用二分查找获取target的大致下标
// 注意如果target在nums中有多个的话,不确定ind指向的是那一个
int ind = Arrays.binarySearch(nums, target);
if(ind >= 0){
// 存在target
// TODO可以节省空间
List<Integer> ans = new ArrayList<Integer>(nums.length - ind);
// 判断是否结束
boolean isFinish = false;
// 由于不确定ind是否为target在排序后nums的最左边的下标
// TODO这里直接从0开始
for(int i = 0; i < nums.length; i++){
if(nums[i] == target){
// 将下标加入结果
ans.add(i);
// 记录状态
isFinish = true;
}else if(isFinish){
// 由于nums是有序的,所以可以直接退出
break;
}
}
return ans;
}
else{
// 不存在target则直接返回空数组
return new ArrayList<Integer>(0);
}
}
}
优化版:
对代码中边界模块进行了优化,同时也在这个基础上对分配的内存进行了优化,但实际的执行效果差不多
216 / 216 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 38.8 MB
// 5938. 找出数组排序后的目标下标
class Solution {
public List<Integer> targetIndices(int[] nums, int target) {
// 排序
Arrays.sort(nums);
// 使用二分查找获取target的大致下标
// 注意如果target在nums中有多个的话,不确定ind指向的是那一个
int ind = Arrays.binarySearch(nums, target);
if(ind >= 0){
// 存在target
int le = ind - 1, ri = ind + 1;
// 寻找左边界
while(le >= 0 && nums[le] == target)
le--;
// 寻找右边界
while(ri < nums.length && nums[ri] == target)
ri++;
// 分配对应的容量
List<Integer> ans = new ArrayList<Integer>(ri - le);
// 移动到对应位置
le++;
while(le < ri){
ans.add(le);
le++;
}
return ans;
}
else{
// 不存在target则直接返回空数组
return new ArrayList<Integer>(0);
}
}
}