查詢陣列中是否存在任意三個數可組成三角形的演算法
分治法:
先把陣列一a[i]為界,分成兩部分,左邊比a[i]小,右邊比a[i]大。
接下來問題就變成了兩個子問題,左右兩個子陣列,再加上一下這三種情況:
1:左面陣列去一個數、右面陣列取一個數,a[i]三個數判斷;
2:左面取兩個數與a[i]判斷;
3:右面取兩個數與a[i]判斷;
程式碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
void swap(int *a,int *b){
int c=*a;
*a=*b;
*b=c; } int valid(int a,int b,int c) { return a+b>c && a+c>b && b+c>a; } int partion(int * a,int p,int q)//快排 { int i,j; for(i = p-1,j = p;j<q;++j) { if(a[j] < a[q] && a[++i]> a[q])//i——j之間的值為大於a[q]的值,i以前的都是比a[q]的值小的值。 swap(&a[i],&a[j]); } swap(&a[i+1],&a[q]); return i+1; } int subtri(int * a,int p,int q) { int mid; if(q-p+1 < 3)return 0; mid = partion(a,p,q); if(subtri(a,p,mid-1)||subtri(a,mid+1,q))return 1; else { int l,r; for(l = p;l<mid;l++) for(r = mid+1;r <= q;++r) { if(valid(a[r],a[l],a[mid]))return 1; } for(l = p;l<mid;l++) for(r = p;r<mid;r++) { if(r != l && valid(a[r],a[l],a[mid]))return 1; } for(l = mid+1;l<=q;l++) for(r = mid+1;r<=1;r++) { if(r != l && valid(a[r],a[l],a[mid]))return 1; } } return 0; } int main() { int a[] = {4,4,1,2,3,5,7,8,9}; printf("%d",subtri(a,0,8)); return 0; }
相關推薦
查詢陣列中是否存在任意三個數可組成三角形的演算法
分治法: 先把陣列一a[i]為界,分成兩部分,左邊比a[i]小,右邊比a[i]大。 接下來問題就變成了兩個子問題,左右兩個子陣列,再加上一下這三種情況: 1:左面陣列去一個數、右面陣列取一個數,a[i]三個數判斷; 2:左面取兩個數與a[i]判斷; 3:右面取兩個數與a[i
查詢陣列中最大的兩個數(Find two Largest Number)
程式設計的確是個循序漸進的過程,有了基礎班,稍微改改就可以新增新功能了,不錯,不錯! 程式碼如下: //JHTP Exercise 4.22: Find two Largest Number //
空間中任意三個點組成三角形面積
問題1:遍歷所有可能的3個點 1 2 3 for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) for(int k = j + 1; k
快速查詢陣列中“和”為X的兩個數
快速判斷在一個數組中,是否存在兩個數字,讓這兩個數字之和等於一個給定的值 X。 以陣列 arr[] = {11, 15, 6, 8, 9, 10} 為例: 當x = 16時, 存在兩個數字的和為16: (6, 10) 輸出: true 當x = 35時, 存
拼多多筆試題一:給出一個無序整數陣列,求任意三個數的最大乘積
題目: 給出一個可能包含正數、零、負數的無序整數序列,從該序列中任選三個數計算乘積,求最大的乘積是多少? 要求:演算法的時間複雜度為O(n),空間複雜度為O(1). 輸入: 第一行輸入n表示序列中整數的個數 第二行輸入n個整數 輸出; 最大的乘積 例如: 輸入: 4 1 0
查詢陣列中每個數 出現的次數
陣列 int[] arr = {1, 1, 1, 33, 3}; //查出來數中數字 一共出現了幾次 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //定義一個
Bit-Map實現查詢陣列中的重複數字
Bit-Map中文翻譯為點陣圖,其實和本文所謂的Bit-Map是有出入的。 所謂的Bit-Map就是用一個bit位來標記某個元素對應的Value, 而Key即是該元素。由於採用了Bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。 查詢一個數組中的重複數字,假設陣列時從0
整型陣列中只有一個或兩個數出現一次,其它的數都出現偶數次
Question: 一個整型數組裡只有一個或兩個數字之外,其他的數字都出現了偶數次。求這個或這兩個只出現一次的數字 解: 題中關鍵資訊為其它數字出現偶數次,想到異或運算的性質知一個數與自身偶數次異或結果為0,可知如果將陣列中所有的數字進行異或,則結果等於這兩個只出現一次的數字的異或
No.26 我與程式碼的日常:逆轉整數,迴文字串,迴文數字,查詢陣列中遺漏數字,判斷2的冪
學習不易,需要堅持。 逆轉整數:Reverse Integer Example1: x = 123, return 321 Example2: x = -123, return -321 處理溢位: 比如整數最大值2147483647逆轉之後的整數值不存在 要求所有值逆轉之後再
關於查詢陣列中最小的k個元素的解答 updated
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
查詢陣列中重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)
這是我BIGO前端面試時,面試官給我出的一道題,題目是長度為N的陣列,元素大小範圍在[1,N-1],只有一個重複的元素,用O(n)的時間複雜度和O(1)的空間複雜度找出來這個重複的元素, 大致思路 1、因為總共有N個數,每個數的範圍是1到N-1,只有一個重複的數,所以這些數肯定是連續的 2
查詢陣列中的眾數
查詢陣列中出現次數最多的數 示例一 int most_(vector<int> arr) { int len = arr.size(); vector<int> tmp(le
二分法查詢陣列中元素的位置
基本思想: 假設資料是按升序排序的,對於給定值key,從序列的中間位置mid開始比較,如果當前位置array[mid]值等於value,則查詢成功;若key小於當前位置值array[mid],則在數列的前半段中查詢,array[low,mid-1];若value大於當前位置
牛客網 查詢陣列中的重複元素
找出陣列 arr 中重複出現過的元素 題目描述: 找出陣列 arr 中重複出現過的元素 示例1 輸入 [1, 2, 4, 4, 3, 3, 1, 5, 3] 輸出 [1, 3, 4] 思路: 1.遍歷原陣列arr,建立變數flag=false,將arr中的每個元
查詢陣列中出現次數最多的元素
1.查詢陣列中每一個元素出現的次數 var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; var countedNames = names.re
利用二分法結合遞迴查詢陣列中的元素的下標
注意:由於二分法只適用於有序陣列的元素查詢,對於無序陣列,我們必須先對其進行排序。 陣列可由Math.random()方法結合迴圈自動生成一個固定長度的int陣列,然後呼叫Arrays.sort()方法對其排序,然後得到我們想要的有序int陣列 第一種方法:不使用遞迴 import ja
查詢陣列中重複次數最多的數字
題目: 給定一個大小為n的陣列,該陣列包含數字的範圍在 [0...k-1], k是一個正整數,k < = n。在這個陣列找到重複次數最多的數字。 要求時間複雜度為n,空間複雜度為1,可以使用原陣列。 原理: 遍歷陣列,讓每個元素作為下標的元素加k,最後誰的值最大,則它
找出陣列中出現一次兩個數,其他數字都出現偶數次
{ unsigned int flag =1; while(flag) //求異或結果,最低的為1的二進位制位,根據此位是否為1,將元素分為兩組,兩個不同的元素,在此位必然,一個為1,一個為0 { if(flag&sum) break;
求無序陣列中最大的K個數 或 第K大的數
1、方法一:要求無序陣列中沒有重複元素,同時允許更改陣列內的內容。主要思想是利用快速排序Partition函式依次進行前K個元素的排序,平均時間複雜度O(n)。#include <iostream> #include <string> #in
bfprt演算法----找出陣列中最小的k個數(Java)
無序陣列中最小的k個數 對於一個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數。 給定一個整數陣列A及它的大小n,同時給定k,請返回其中最小的k個數。 測試樣例: [1,2,4,3],4,2 返回:[1,2] (1)利用堆,時間複雜度O(Nlog