第一题:
/*
* 绳子覆盖的最大长度,给定一个有序数组,表示在数轴之上,和一个距离L,求L覆盖数组中最多的元素个数
* O(1)
*/
#include<iostream>
using namespace std;
int maxpoint1(int arr[],int L){
int left =0;
int right = 0;
int max = 0;
while (left<10)
{
while (right<10 && (arr[right]-arr[left])<=L)
{
right++;
}
//先运算后++
int t = right-left;
max = max>t?max:t;
left++;
}
return max;
}
int main(){
int arr[]={1,2,4,6,9,12,14,15,16,17};
int L = 4;
int max = maxpoint1(arr,L);
cout<<"the max is :"<<max<<endl;
return 0;
}
主要方法是:双指针法,灵活使用
第二题
/*
* 给定一个字符串,字符串中包含无序的SB,
* 现要求将所有的S移动到左边,所有的B移动到右边或者反之,求最小移动次数
* 字符串如果为空,移动次数为0
* O(1)
*/
#include<iostream>
#include<string>
using namespace std;
int minSteps(string S){
int Length = S.size();
if(Length == 0){
return 0;
}
int j = 0;
int step1 = 0;
for (int i = 0; i < Length; i++)
{
if(S[i]=='S'){
step1+=i-j;
j++;
}
}
int k = 0;
int step2 = 0;
for (int i = 0; i < Length; i++)
{
if(S[i]=='B'){
step2+=i-k;
k++;
}
}
return step1>step2?step2:step1;
}
int main(){
string S("SBSSBSS");
int min_steps = minSteps(S);
cout<<"the min_steps is :"<<min_steps<<endl;
return 0;
}
总结:也是双指针的使用,灵活使用
双指针,用于动态的数组或者链表等操作,有奇效!!!!
改进点:两个for循环,改成一个for循环
238

被折叠的 条评论
为什么被折叠?



