算法总结(一)

91 阅读1分钟

1. 数组类之双指针类型

算法中双指针技巧可以分为左右指针和快慢指针两种类型。其定义可概括如下:
  • 左右指针:左右指针两个指针分别指向从数组的头和尾
    
  • 快慢指针:从数组的同一侧开始出发
    

1.2 快慢指针

快指针的作用是不断地向前找到匹配的元素,慢指针则是用于保存快指针匹配到的元素。
  • (leetcode26)删除有序数组中的重复项,且要求使用常量级的空间存储 在数组有序的条件下,重复项都是相连。将快慢指针均指向数组头部,快指针不断地向前移动,一旦匹配到元素和慢指针元素的值不相同,就保存该值,将慢指针向前移动
    function removeDuplicates(nums){
        let i = 0,j = 0;
        
        while(j < nums.length){
            if(nums[j] !== nums[i]){
                i++;
                nums[i] = nums[j];
            }
            j++;
            
        }
    }
  • (leetcode83) 原地移除指定元素 同样当快指针指向的元素非指定元素的时候,将其赋值给慢指针
   function removeElements(nums,val){
        let i = 0,j = 0;
        
        while(j < nums.length){
            if(nums[j] !== val){
                nums[i] = nums[j];
                i++;
            }
            j++;
            
        }
    }

1.2.1 快慢指针--滑动窗口

1.3 左右指针

左右指针一般都是针对于有序的数组,根据左右元素的值来决定下一步是左指针移动还是右指针移动。

  • 二分查找算法
  • 判断两数之和(在有序数组中找到能组成指定值的两个数)
  function twosums(nums,val){
        let i = 0,j = nums.length;
        
        while(i<j){
           let sum = nums[i] + nums[j];
           if(sum === val) return [i,j];
           sum > val? j--:i++; 
        }
    }
  • 反转数组
  • 最长回文子串 回文串的长度可以为奇数、偶数,奇数回文串的中心为一个元素,左右两边依次对称。偶数长度的回文串的中心为两个元素,左右同样对称。
      function palindrome(s,i,j){
        while(i >= 0 && j <= s.length && s[i] === s[j]){
            i--;j++;   
        }
        // 返回以s[i] s[j] 为中心的最长回文串
        return s.substring(i+1,j)
    }
    
    function largestpalindrome(s){
        let res = '';
        for(let i = 0; i < s.length; i++){
            const res1 = palindrome(s,i,i); // 奇数长度
            const res2 = palindrome(s,i,i+1); // 偶数长度
            const resi = palindrome(s,i,i).lenght > palindrome(s,i,i+1).length? palindrome(s,i,i):palindrome(s,i,i+1);
            
            res = res.length > resi.length? res:resi
            
        }
        return res;
    }