📘北尘_ :个人主页
🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》
☀️走在路上,不忘来时的初心
文章目录
一、将x减到0的最小操作数
二、无重复的最长子串
三、最大连续为1的个数
四、长度最小的子数组
一、将x减到0的最小操作数
1、题目讲解
2、讲解算法原理
3、代码实现
class Solution {
public :
int minOperations ( vector< int > & nums, int x) {
int n= nums. size ( ) , ret= 0 , sum= 0 , target, len= - 1 ;
for ( int i= 0 ; i< n; i++ )
ret+= nums[ i] ;
target= ret- x;
if ( target< 0 ) return - 1 ;
for ( int left= 0 , right= 0 ; right< n; right++ )
{
sum+= nums[ right] ;
while ( sum> target)
sum-= nums[ left++ ] ;
if ( sum== target)
len= max ( len, right- left+ 1 ) ;
}
if ( len== - 1 ) return len;
else return n- len;
}
} ;
二、无重复的最长子串
1、题目讲解
2、讲解算法原理
3、代码实现
class Solution {
public :
int lengthOfLongestSubstring ( string s) {
int n= s. size ( ) ;
int count[ 128 ] = { 0 } , len= 0 ;
for ( int left= 0 , right= 0 ; right< n; right++ )
{
count[ s[ right] ] ++ ;
while ( count[ s[ right] ] == 2 )
count[ s[ left++ ] ] -- ;
len= max ( len, right- left+ 1 ) ;
}
return len;
}
} ;
三、最大连续为1的个数
1、题目讲解
2、讲解算法原理
3、代码实现
class Solution {
public :
int longestOnes ( vector< int > & nums, int k) {
int n= nums. size ( ) , zero= 0 , len= 0 ;
for ( int left= 0 , right= 0 ; right< n; right++ )
{
if ( nums[ right] == 0 ) zero++ ;
while ( zero> k)
if ( nums[ left++ ] == 0 ) zero-- ;
}
return len;
}
} ;
四、长度最小的子数组
1、题目讲解
2、讲解算法原理
3、代码实现
class Solution {
public :
int minSubArrayLen ( int target, vector< int > & nums)
{
int n= nums. size ( ) , len= INT_MAX;
int sum= 0 ;
for ( int left= 0 , right= 0 ; right< n; right++ )
{
sum+= nums[ right] ;
while ( sum>= target)
{
len= min ( len, right- left+ 1 ) ;
sum-= nums[ left] ;
left++ ;
}
}
return len== INT_MAX? 0 : len;
}
} ;