LeetCode快慢指針遍歷和Hash高頻題(二)

我是方圓
“無它,唯手熟爾”

141. 環形鏈表

給定一個鏈表,判斷鏈表中是否有環。

爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環

示例:

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。

在這裏插入圖片描述

class Solution{
	public boolean hasCycle(ListNode head){
		//判空
		if(head == null || head.next == null)
			return false;
		
		//創建快慢指針
		ListNode fast = head.next;
		ListNode slow = head;
		//在slow和fast沒有相遇的時候進行循環
		while(slow != fast){
			//如果fast能跑到頭,說明沒有環
			if(fast == null || fast.next == null){
				return false;
			}
			
			fast = fast.next.next;
			slow = slow.next;
		}
		
		return true;
	}

}

202. 快樂數

編寫一個算法來判斷一個數 n 是不是快樂數。

「快樂數」定義爲:對於一個正整數,每一次將該數替換爲它每個位置上的數字的平方和,然後重複這個過程直到這個數變爲 1,也可能是 無限循環 但始終變不到 1。如果 可以變爲 1,那麼這個數就是快樂數。

如果 n 是快樂數就返回 True ;不是,則返回 False 。

示例:

輸入:19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

//同樣也是應用快慢指針遍歷,若是快樂數,則沒有鏈表環
class Solution{
	
	//自己先寫一個getNext()函數
	public int getNext(int n){
		int totalSum = 0;
		
		//計算各位的平方和
		while(n > 0){
			int num = n % 10;
			totalSum += num * num;
			n /= 10;
		}
		return totalSum;
	}

	public boolean isHappy(int n){
		//定義快慢數
		int fast = getNext(n);
		int slow = n;

		//slow追不上fast的時候進行循環
		//當沒有環的情況下,slow和fast最終都爲1,是快樂數
		//當有環的情況下,fast和slow能在環上相遇,不是快樂數
		while(slow != fast){
			slow = getNext(slow);
			fast = getNext(getNext(fast));
		}
		return fast == 1;
	}
}

876. 鏈表的中間節點

給定一個帶有頭結點 head 的非空單鏈表,返回鏈表的中間結點。

如果有兩個中間結點,則返回第二個中間結點。

示例:

輸入:[1,2,3,4,5,6]
輸出:此列表中的結點 4 (序列化形式:[4,5,6])
由於該列表有兩個中間結點,值分別爲 3 和 4,我們返回第二個結點。

//利用快慢指針遍歷,快指針每次走兩格
//慢指針每次走一格,快指針走到頭,慢指針到中間
class Solution{
	public ListNode middleNode(ListNode head){
		//定義快慢指針
		ListNode fast = head;
		ListNode slow = head;

		while(fast != null || fast.next != null){
			fast = fast.next.next;
			slow = slow.next;
		}
		return slow;
	}
}

1. 兩數之和(Hash相關)

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。

示例:

給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

class Solution{
	public int[] twoSum(int[] nums,int target){
		
		//定義一個HashMap,key爲數組值,value爲下標
		Map<Integer,Integer> map = new HashMap<>();
	
		for(int i = 0;i < nums.length;i++){
			int complement = target - nums[i];
			//若map中有了對應的差值
			//那麼則可返回結果
			if(map.containsKey(complement)){
				return new int[]{map.get(complement),i};
			}
			//map中沒有找到對應的差值,添加進去
			map.put(nums[i],i);
		}
		
		//沒有結果,返回null
		return null;
	}
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章