力扣-初级算法

一,数组

1.删除排序中的重复项

错误方法

正确方法

2.购买股票的最佳时机ll

 class Solution {

    public int maxProfit(int[] prices) {

        int lirun =0;

if(prices.length>=1){

for(int i=1;i<prices.length;i++){

if(prices[i-1]<prices[i]){

    lirun+= prices[i]-prices[i-1];

}}

}

return lirun; }

}

3.旋转数组

错误代码:超出时间限制

class Solution {

    public void rotate(int[] nums, int k) {

int a =0;

if(nums.length>1){

    for(int j=0;j<k;j++){

        a=nums[nums.length-1];

for(int i=nums.length-1;i>0;i--){

    nums[i]=nums[i-1];}

nums[0]=a;

}}

}}

正确代码

4.存在重复元素

使用set集合有不重复性的原则筛选

class Solution {

       public boolean containsDuplicate(int[] nums) {

   Set a = new HashSet<>();

   for(int num : nums){

   if(!a.add(num)){

       return true;

   } }   return false;}}

5.

使用set不重复的属性筛选出数组中重复属性并去除

class Solution {

    public int singleNumber(int[] nums) {

Set a = new HashSet<>();

for(int num:nums){

    if(!a.add(num)){

//set的去除语句

        a.remove(num);}}

  return (int) a.toArray()[0]; }}

6.两个数组的交集

Arrays.sort(nums1);对数组排序

List<Integer> a = new ArrayList<>();创建list列表

class Solution {

    public int[] intersect(int[] nums1, int[] nums2) {

List<Integer> a = new ArrayList<>();

//排序

Arrays.sort(nums1);

Arrays.sort(nums2);

int i=0;

int j=0;

while(i < nums1.length && j < nums2.length){

    if(nums1[i]>nums2[j]){

        j++;

    }else if(nums1[i]<nums2[j]){

        i++;

    }else{

        a.add(nums1[i]);

        i++;

        j++;}}

int c=0;

        int[] res = new int[a.size()];

        for (int k = 0; k<a.size();k++) {

            res[c++] = a.get(k);

        } return res; }}

6.加一

class Solution {

    public int[] plusOne(int[] digits) {

for(int i=digits.length-1;i>=0;i--){

if(digits[i]!=9){

++digits[i];

return digits;

}else{

    digits[i]=0;

}}

int []a = new int[digits.length+1];

a[0]=1;

return a;}}

7.移动零

class Solution {

    public void moveZeroes(int[] nums) {

int b=0;

for(int i=0;i<nums.length;i++){

if(nums[i] != 0){

 nums[b++]=nums[i];

}}

for(int i=b;i<nums.length;i++){

    nums[i]=0;}}}

8.两数之和

错误没有嵌套第二层循环

class Solution {

    public int[] twoSum(int[] nums, int target) {

int a=0;

if(target-nums[a++]>0)

{

    for(int i=a;i<nums.length;i++)

    {

        if(nums[a-1]+nums[i]==target)

        {

           int b[]= new int[]{a-1,i};

           return b; }  }} }}

正确代码(不懂)

使用HashMap

存储:put 方法 put(key,value)

查询 : get 方法 get(key)

class Solution {

        public int[] twoSum(int[] nums, int target) {

        Map<Integer, Integer> a = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {

            if (a.get(target - nums[i]) != null) {

                return new int[]{a.get(target - nums[i]), i};

            }

            a.put(nums[i], i);

        }

        return new int[]{0, 0};

    }

}

9.

二.字符串

1.反转字符串

class Solution {

    public void reverseString(char[] s) {

char abb;

for(int i=0;i<s.length/2;i++){

    abb=s[i];

    s[i]=s[s.length-1-i];

    s[s.length-1-i]=abb;

}}}

2.整数反转

需要假设环境不允许存储 64 位整数(有符号或无符号)的环境,所以使用long

class Solution {

    public int reverse(int x) {

       long a=0;

while(x!=0){

    a=a*10+x%10;

    x=x/10;

}

return (int)a == a?(int)a:0;

    }

}

3.查找字符串中第一个唯一字符

使用api

indexOf()从前往后查找,lastIndexOf()从后往前查找

class Solution {

   public int firstUniqChar(String s) {

        for (int i = 0; i < s.length(); i++)

            if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i)))

                return i;

        return -1;

    }

}

4.有效字母异位词

先创建两个s,t的集合,使用arrays.sort排序,最后用Arrays.equals(s,t)类比

class Solution {

     public boolean isAnagram(String s, String t) {

        char[] sChar = s.toCharArray();

        char[] tChar = t.toCharArray();

        Arrays.sort(sChar);

        Arrays.sort(tChar);

        return Arrays.equals(sChar, tChar);

    }

}

5.验证回文串

错误代码

class Solution {

    public boolean isPalindrome(String s) {

char []a = new char[]();

int j=0

for(int i=0;i<s.length;i++){

    if(!Character.isLetterOrDigit(s[i])){

        char[j]=s[i]

        j++

    }

}

int a=0;

 for (int i = 0; i < s.length(); i++)

    if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))){

    a++;

}

    }

}

正确代码

使用Character.isLetterOrDigit判断是不是字母和数字

s.charAt(l)s.charAt(r)查找到左右两边的字母或数字

Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)判断是否相同

class Solution {

    public boolean isPalindrome(String s) {

int l=0,r=s.length()-1;

while(l<r){

    while(l<r&&!Character.isLetterOrDigit(s.charAt(l))){

        l++;

    }

    while(l<r&&!Character.isLetterOrDigit(s.charAt(r))){

        r--;

    }

 if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))

               { return false;}

            l++;

            r--;

}

return true;

    }

}

6.字符串转换整数 (atoi)(不会)

7.实现strStr()

错误代码:

class Solution {

    public int strStr(String haystack, String needle) {

        Char []a=new char[]();

for(int i=0;i<haystack.length;i++){

    if(haystack(i)==needle(i)){

        for(int j=0;j<needle.length;j++){

            int b=i;

            char(j)=haystack(b++);

        }

    }

     if(char==needle)

     return 0;

     else

     return -1;

}

if(char==needle)

     return 0;

     else

     return -1;}}

正确代码

8.外观数列

class Solution {

    public String countAndSay(int n) {

if(n==1){

    return "1";

}

//获取n-1的数列

String s1 = countAndSay(n-1);

建造StringBuilder容器

StringBuilder builder = new StringBuilder();

char a = s1.charAt(0);

int b = 0 ;

for(int i=0;i<s1.length();i++)

{

    if(s1.charAt(i)==a){

        b++;

    }else{

向容器中添加计数器的值

        builder.append(b);

添加本身值

        builder.append(a);

重新定义量

        a = s1.charAt(i);

        b = 1;}}

builder.append(b);

        builder.append(a);

输出string形式builder

        return builder.toString();}}

三.链表

1.删除链表中的节点(没懂)

class Solution {

    public void deleteNode(ListNode node) {

        node.val = node.next.val;

        node.next = node.next.next;}}

目标:杀掉A

正常杀手需要找到A的把柄才可以杀掉A,
可现在找到A本人后竟然没有可以获取A把柄的途径
A得知我们要杀他,心生一计,可助你完成任务
A说我有B的把柄,你杀了B,我改头换面,以B的身份活着
GC也会自动清理掉B的尸体,没人会知道的

2.删除链表的倒数第n个节点

    public ListNode removeNthFromEnd(ListNode head, int n) {

ListNode n1 = head;

 int last = length(head) - n;

if(last == 0){

return head.next;}

for(int i=0; i<last-1;i++){

    n1 = n1.next;}

n1.next=n1.next.next;

return head;}

    private int length(ListNode head) {

    int len = 0;

    while (head != null) {

 len++;

 head = head.next;}

    return len;}

3.反转链表

   public ListNode reverseList(ListNode head) {

ListNode newhead = null;

while(head != null){

//为下次循环创建节点

    ListNode n1 = head.next;

//head.next在newhead的头节点

    head.next = newhead;

创建新的节点为head现在的节点

    newhead = head;

    head = n1; 

}

return newhead;

    }

4.合并两个有序链表

   public ListNode mergeTwoLists(ListNode list1, ListNode list2) {

if(list1 == null){

    return list2;

}

if(list2 == null){

    return list1;

}

ListNode n2 = new ListNode(0);

ListNode n1 = n2;

while(list1!=null&&list2!=null){

    if(list1.val>=list2.val){

           n1.next = list2;

           list2= list2.next;

    }else{

        n1.next =list1;

        list1=list1.next;

    }

    n1=n1.next;

}

 n1.next = list1 !=null?list1:list2;

 return n2.next;

    }

5.回文链表

 public boolean isPalindrome(ListNode head) {

        ListNode f = head;

        ListNode s = head;

        while(f!=null&&f.next!=null){

            s=s.next;

            f=f.next.next;

        }

        if(f!=null){

            s=s.next;

        }

       s = res(s);

       f = head;

       while(s!=null){

           if(s.val!=f.val)

               return false;

               s=s.next;

               f=f.next;

           

       }

        return true;

    }

public ListNode res(ListNode head){

    ListNode n1 = null;

while(head!=null){

    ListNode next= head.next;

    head.next = n1;

    n1 = head ;

    head = next;

}

return n1;

}

6.环形链表

   public boolean hasCycle(ListNode head) {

        ListNode f =head;

        ListNode s = head;

        while(f!=null&&f.next!=null){

            f=f.next.next;

            s=s.next;

            if(s==f){

                return true;

            }

        }

        return false;

    }

四.树

1.二叉树最大深度

 public int maxDepth(TreeNode root) {

        return root==null? 0 : Math.max(maxDepth(root.left), maxDepth(root.right))+1;

    }

不懂的一种写法

    public int maxDepth(TreeNode root) {
        if (root == null)
            return 0;
        //创建一个队列
        Deque<TreeNode> deque = new LinkedList<>();
        deque.push(root);
        int count = 0;
        while (!deque.isEmpty()) {
            //每一层的个数
            int size = deque.size();
            while (size-- > 0) {
                TreeNode cur = deque.pop();
                if (cur.left != null)
                    deque.addLast(cur.left);
                if (cur.right != null)
                    deque.addLast(cur.right);
            }
            count++;
        }
        return count;
    }

2.验证二叉探索树

五.排序和探索

1.合并两个有序数组

错误版本(当nums1或nums2中有null时,不能使用)

 public void merge(int[] nums1, int m, int[] nums2, int n) {

int []a = new int[m+n];

int i=0;

int j=0;

int b=0;

while((j<n||i<m)){

if(nums1[i]<=nums2[j]){

    if(nums1[i]!=0){

    a[b++]=nums1[i++];

   }else{

        a[b++]=nums2[j++]; }

}else{

    if(nums2[i]!=0){

    a[b++]=nums2[j++];

   }else{

        a[b++]=nums1[i++]; }}}

for (int k = 0; k < m + n; k++) {

            nums1[k] = a[k]; } }

正确版本

数据结构方法

    public void merge(int[] nums1, int m, int[] nums2, int n) {

int i = m-1;

int j = n-1;

int c = n+m-1;

while(j>=0){

    nums1[c--] = (i >= 0 && nums1[i] > nums2[j])?nums1[i--]:nums2[j--];

}

    }

2.

六.动态规划

1.爬梯子

复杂性高,时间超时方法

    public int climbStairs(int n) {

if(n<=1)

return 1;

if(n<3)

return n;

int a = climbStairs(n-1)+climbStairs(n-2);

return a;

    }

可以使用多方法定义来使用(但是时间还是大)

public static int climbStairs(int n) { return Fibonacci(n, 1, 1); }

public static int Fibonacci(int n, int a, int b) {
        if (n <= 1)
            return b;
        return Fibonacci(n - 1, b, a + b);
    }

在一个方法的实现

    public int climbStairs(int n) {

        if (n <= 1)

            return 1;

        int[] a = new int[n + 1];

        a[1] = 1;

        a[2] = 2;

        for (int i = 3; i <= n; i++) {

            a[i] = a[i - 1] + a[i - 2]; }

        return a[n];}

2.买卖股票的最佳时机

超时

 public int maxProfit(int[] prices) {

        int a =0;

        int i=0;

        int j=0;

        for(i=1;i<prices.length;){

while(j<prices.length){

  

    a=Math.max(prices[i]-prices[i-1],a);

    }

}

return a;

    }

正确

    public int maxProfit(int[] prices) {

if(prices==null||prices.length==0)

return 0;

int max =0;

int min =prices[0];

for(int i=0;i<prices.length;i++){

    min = Math.min(prices[i],min);

    max = Math.max(prices[i]-min,max);}

return max;  }

3.最大子序和

    public int maxSubArray(int[] nums) {

    int max = nums[0];

    int[]a = new int[nums.length];

    a[0]=nums[0];

    for(int i =1;i<nums.length;i++){

用创建的数组来表示子序和,当子序和为负数时,子序取0,再从头开始

         a[i] = Math.max(a[i-1],0) + nums[i];

         max = Math.max(max,a[i]);

    }

    return max;

    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值