暑假算法7.3,Day02
第一题
leetcode第一题
基础的二分查找,学校老师上课也讲过。
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left<=right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
}
第二题
leetcode第二题
水题,直接把下标保存到数组里面输出即可
class Solution {
public List<Integer> targetIndices(int[] nums, int target) {
List<Integer> res = new ArrayList<>();
Arrays.sort(nums);
int n = nums.length;
for(int i = 0; i < n; ++i){
if(nums[i] == target)
res.add(i);
}
return res;
}
}
第三题
leetcode第三题
直接遍历就行了,也是水题。
class Solution {
public int findDuplicate(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]){
return nums[i];
}
}
return -1;
}
}
第四题
这个题目一开始理解错了,以为只要输出1的个数和输入的sum的差即可。
显然这是不对的,后来有大佬给出了题目的解释,成功的读懂了题目。
就是可以理解成为找一段最长的和为sum的连续子序列。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin>>N;
int n,s;
while(N--)
{
cin>>n>>s;
int a[n+5];
int sum=0,ans=-1;
for(int i=1; i<=n; i++)
{
cin>>a[i];
sum+=a[i];
}
if (sum < s)
{
cout << "-1" << endl;
continue;
}
int j=1,p,k=0;
for(int i=1; i<=n; i++)
{
k+=a[i];
while(k>s)
{
k-=a[j];
j++;
}
if(k==s)
{
p=i-j+1;
ans=max(p,ans);
}
}
cout<<n-ans<<endl;
}
return 0;
}