0
点赞
收藏
分享

微信扫一扫

牛客网top101(16,删除有序链表中重复的元素,17,二分查找,18,二维数组的查找)

c一段旅程c 2022-04-06 阅读 39

删除有序链表中重复的元素

在这里插入图片描述

思路一:

step 1:给链表前加上表头,方便可能的话删除第一个节点。
step 2:遍历链表,每次比较相邻两个节点,如果遇到了两个相邻结点相同,则新开内循环将这一段所有的相同都遍历过去。
step 3:在step 2中这一连串相同的节点前的节点直接连上后续第一个不相同值的节点。
step 4:返回时去掉添加的表头。

思路二:

使用递归的方法去求解,当head后面存在值且与head的值相等的话,那么就一直向后找,直到找到不相等的值为止,然后对后面的那个结点进行递归,删除前面重复的结点,如果head的值与head.next的值不相等的话,那么就递归后面的结点,最后返回head变量。

实例分析:

给出的链表为1→2→3→3→4→4→5
代码:

import java.util.*;
 
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
 
public class Solution {
    /**
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null){
            return null;
        }
        if(head.next != null && head.val == head.next.val){//发现有重复值
                while(head.next != null && head.val == head.next.val){
                    head = head.next;//删除
            }
            return deleteDuplicates(head.next);//把与删除的那个结点相同的结点也进行删除
        }
        head.next = deleteDuplicates(head.next);//当没有发现重复值的情况,就一直进行递归操作
        return head;
    }
}

递归操作,将链表元素值进行递归,重复递归导致其时间复杂度为O(N),因为没有占用任何的内存空间,所以其空间复杂度为O(1)。

二分查找法

在这里插入图片描述
思路解析:
step 1:从数组首尾开始,每次取中点值。
step 2:如果中间值等于目标即找到了,可返回下标,如果中点值大于目标,说明中点以后的都大于目标,因此目标在中点左半区间,如果中点值小于目标,则相反。
step 3:根据比较进入对应的区间,直到区间左右端相遇,意味着没有找到。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        // write code here
        int l = 0 ;
        int r = nums.length - 1;
        while ( l <= r) {
            int m = (l + r) / 2;
            if(nums[m] == target) 
                return m;
            if(nums[m] > target)
                r = m - 1;
            else
                l = m + 1;
        }
        return -1;
    }
}

二维数组的查找

在这里插入图片描述

解题思路:

首先看四个角,左上与右下必定为最小值与最大值,而左下与右上就有规律了:左下元素大于它上方的元素,小于它右方的元素,右上元素与之相反。我们可以在查找时使用二分法,将整个矩阵分成行、列两部分:

step 1:首先获取矩阵的两个边长,判断特殊情况。
step 2:首先以左下角为起点,若是它小于目标元素,则往右移动去找大的,若是他大于目标元素,则往上移动去找小的。
step 3:若是移动到了矩阵边界也没找到,说明矩阵中不存在目标值。
代码:

public class Solution {
    public boolean Find(int target, int [][] array) { 
        //优先判断特殊 fast-template
        if(array.length == 0)
            return false;
        int n = array.length;
        if(array[0].length == 0)
            return false;
        int m = array[0].length;
        //从最左下角的元素开始往左或往上
        for(int i = n - 1, j = 0; i >= 0 && j < m; ){
            //元素较大,往上走
            if(array[i][j] > target)
                i--;
            //元素较小,往右走
            else if(array[i][j] < target)
                j++;
            else
                return true;
        }
        return false;
    }
}
举报

相关推荐

0 条评论